免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 草上飞2008
打印 上一主题 下一主题

大赛评选结果已出,敬请关注!:PHP编程大赛隆重启动,PHP开发大挑战 [复制链接]

论坛徽章:
59
2015七夕节徽章
日期:2015-08-24 11:17:25ChinaUnix专家徽章
日期:2015-07-20 09:19:30每周论坛发贴之星
日期:2015-07-20 09:19:42ChinaUnix元老
日期:2015-07-20 11:04:38荣誉版主
日期:2015-07-20 11:05:19巳蛇
日期:2015-07-20 11:05:26CU十二周年纪念徽章
日期:2015-07-20 11:05:27IT运维版块每日发帖之星
日期:2015-07-20 11:05:34操作系统版块每日发帖之星
日期:2015-07-20 11:05:36程序设计版块每日发帖之星
日期:2015-07-20 11:05:40数据库技术版块每日发帖之星
日期:2015-07-20 11:05:432015年辞旧岁徽章
日期:2015-07-20 11:05:44
161 [报告]
发表于 2010-10-03 20:24 |只看该作者
7:设有n 种物品,每种物品有一个重量及一个价值。但每种物品的数量是无限的,同时有一个背包,最大载重量为M,今从n 种物品中选取若干件(同一种物品可以多次选取),使其重量的和小于等于M,而价值的和为最大。
  1. <?php
  2. /*
  3. 设有n 种物品,每种物品有一个重量及一个价值。但每种物品的数量是无限的,同时有一个背包,最大载重量为M,今从n 种物品中选取若干件(同一种物品可以多次选取),使其重量的和小于等于M,而价值的和为最大。
  4. Input
  5. 第一行:两个整数,M(背包容量,M<= 200)和N(物品数量,N<= 30); 第2..N+1 行:每行二个整数Wi,Ui,表示每个物品的重量和价值。
  6. Output
  7. 仅一行,一个数,表示最大总价值。
  8. Sample Input
  9. 12 4
  10. 2  1
  11. 3  3
  12. 4  5
  13. 7  9
  14. Sample Output
  15. 15
  16. */
  17. set_time_limit(30);
  18. define(’NOWTIME’,time());
  19. function microtime_float()
  20. {
  21.     list($usec, $sec) = explode(” “, microtime());
  22. $sec=$sec-NOWTIME;
  23.     return ((float)$usec + (float)$sec);
  24. }
  25. //初始化数组
  26. /*
  27. $bbw=12;
  28. $arywp=array();
  29. $arywp[]=array(’d',2,1);
  30. $arywp[]=array(’c',3,3);
  31. $arywp[]=array(’b',4,5);
  32. $arywp[]=array(’a',7,9);
  33. */
  34. $time_start = microtime_float();
  35. //开始计算
  36. $wpnum=count($arywp);
  37. $wpnum=20; //允许的物品类型数量
  38. $bbw=rand(5*$wpnum,50*$wpnum); //背包允许最大重量
  39. for($i1=0;$i1<$wpnum;$i1++){ //初始化每个物品类型的重量和价值
  40. $arywp[$i1][0]=”w”.$i1; //名称
  41. $arywp[$i1][1]=rand(50,80); //重量
  42. $arywp[$i1][2]=rand(20,50); //价值
  43. $arywp[$i1][3]=$arywp[$i1][2]/$arywp[$i1][1];//单位重量的最大价值
  44. }
  45. function cmp($a, $b){
  46. $returnvalue=0;
  47.     if ($a[3] == $b[3]) {
  48.   $returnvalue=  0;
  49.     } else {
  50.      $returnvalue = ($a[3] > $b[3]) ? -1 : 1;
  51. }
  52. return $returnvalue;
  53. }
  54. //按单位最大价值排序
  55. usort($arywp, “cmp”);
  56. print_r($arywp);
  57. echo ” <br />\n”;
  58. //递归函数,计算剩余空间的允许物品最大价值
  59. function getmaxval($bbw,$arywp){
  60. //最大单位物品的重量、价值、数量
  61. $use_w=0;
  62. $use_v=0;
  63. $ary_userwp=array();
  64. //当前空间的允许物品最大价值
  65. $maxwgt=0;
  66. $maxval=0;
  67. $maxuserwp=array();

  68. $wp = array_shift($arywp);
  69. $num= floor(($bbw-$use_w)/$wp[1]); //最大单位物品的最大允许个数
  70. //echo ” countmax : $num * “.$wp[0].”<br/>\n”;
  71. if(count($arywp)==0 || $bbw-$use_w==$wp[1]*$num){ //没有剩余物品或刚好填满 //递归结束条件
  72.   if($num>0){
  73.    $maxwgt+=$wp[1]*$num;
  74.    $maxval+=$wp[2]*$num;
  75.    $maxuserwp[$wp[0]]=$num;
  76.   }
  77. } else {
  78.   for($i=0;$i<=$num;$i++){ //计算最大单位物品不同数量时的最大价值
  79.    $use_w=$wp[1]*$i;
  80.    $use_v=$wp[2]*$i;
  81.    $ary_userwp[$wp[0]]=$i;
  82.    if(($num-$i)*$wp[2]/($bbw-$use_w) < $arywp[0][3]){ //剩余空间的单位价值小于下件物品的单位价值
  83.     list($subuse_w,$subuse_v,$subusewp)=getmaxval($bbw-$use_w,$arywp);
  84.    } else {
  85.     $subuse_w=0;
  86.     $subuse_v=0;
  87.     $subusewp=array();
  88.    }
  89.    if($use_v+$subuse_v>$maxval || $maxval==0){ //比较最大价值
  90.     $maxwgt=$use_w+$subuse_w;
  91.     $maxval=$use_v+$subuse_v;
  92.     if($i>0){
  93.      $maxuserwp=array_merge($ary_userwp,$subusewp);
  94.     } else{
  95.      $maxuserwp=$subusewp;
  96.     }
  97.    }
  98.   }
  99.   //print_r($maxuserwp);
  100.   //echo ” maxwgt : $maxwgt  maxval : $maxval<br/>\n”;
  101. }
  102. //返回 使用的重量,最大价值、使用的物品数量数组
  103. return array($maxwgt,$maxval, $maxuserwp);
  104. }
  105. //开始计算
  106. $arysulte= getmaxval($bbw,$arywp);
  107. //输出结果
  108. echo ” bbw “.$bbw.” “;
  109. print_r($arysulte);
  110. $time_end = microtime_float();
  111. $runtime = $time_end – $time_start;
  112. echo ” runtime : “.$runtime;
  113. ?>
复制代码

论坛徽章:
59
2015七夕节徽章
日期:2015-08-24 11:17:25ChinaUnix专家徽章
日期:2015-07-20 09:19:30每周论坛发贴之星
日期:2015-07-20 09:19:42ChinaUnix元老
日期:2015-07-20 11:04:38荣誉版主
日期:2015-07-20 11:05:19巳蛇
日期:2015-07-20 11:05:26CU十二周年纪念徽章
日期:2015-07-20 11:05:27IT运维版块每日发帖之星
日期:2015-07-20 11:05:34操作系统版块每日发帖之星
日期:2015-07-20 11:05:36程序设计版块每日发帖之星
日期:2015-07-20 11:05:40数据库技术版块每日发帖之星
日期:2015-07-20 11:05:432015年辞旧岁徽章
日期:2015-07-20 11:05:44
162 [报告]
发表于 2010-10-03 20:31 |只看该作者
回复 160# 魔法鱼。


    谢谢!

论坛徽章:
59
2015七夕节徽章
日期:2015-08-24 11:17:25ChinaUnix专家徽章
日期:2015-07-20 09:19:30每周论坛发贴之星
日期:2015-07-20 09:19:42ChinaUnix元老
日期:2015-07-20 11:04:38荣誉版主
日期:2015-07-20 11:05:19巳蛇
日期:2015-07-20 11:05:26CU十二周年纪念徽章
日期:2015-07-20 11:05:27IT运维版块每日发帖之星
日期:2015-07-20 11:05:34操作系统版块每日发帖之星
日期:2015-07-20 11:05:36程序设计版块每日发帖之星
日期:2015-07-20 11:05:40数据库技术版块每日发帖之星
日期:2015-07-20 11:05:432015年辞旧岁徽章
日期:2015-07-20 11:05:44
163 [报告]
发表于 2010-10-03 20:52 |只看该作者
8:设随机抽到A的概率为0.1,B的概率为0.2,C的概率为0.3,D的概率为0.4,现在求按此概率随机抽出一个字母的算法,
  1. <?php
  2. /**
  3. * 根据概率取随机数的算法(仅抽取1个)
  4. * 用法:
  5. * $proArr = array(10,20,30,40);
  6. * $result = pro_rand($proArr);
  7. * echo '你抽到的$proArr数组索引是'. $result. ',其预设概率数是'. $proArr[$result];
  8. ** @param array $proArr 概率数组。格式为array('A'=>10, 'B'=>40, 'C'=>50),或者array(10,40,50)。数组的每个键值(value)必须为大于1的整数;所有数组键值(value)加起来即为其总概率精度
  9. * @return mixed $result 结果,将返回抽取到的概率数组索引值。
  10. */
  11. function pro_rand( $proArr ){
  12.     $result = '';

  13.     //概率数组的总概率精度
  14.     $proSum = array_sum($proArr);
  15.    
  16.       foreach ( $proArr as $key => $proCur ){
  17.         $randNum = mt_rand(1, $proSum);
  18.         if( $randNum <= $proCur ){
  19.             $result = $key;
  20.             break;
  21.         }else{
  22.             $proSum -= $proCur;
  23.         }
  24.     }
  25.    
  26.     return $result;
  27.    
  28. }

复制代码

论坛徽章:
59
2015七夕节徽章
日期:2015-08-24 11:17:25ChinaUnix专家徽章
日期:2015-07-20 09:19:30每周论坛发贴之星
日期:2015-07-20 09:19:42ChinaUnix元老
日期:2015-07-20 11:04:38荣誉版主
日期:2015-07-20 11:05:19巳蛇
日期:2015-07-20 11:05:26CU十二周年纪念徽章
日期:2015-07-20 11:05:27IT运维版块每日发帖之星
日期:2015-07-20 11:05:34操作系统版块每日发帖之星
日期:2015-07-20 11:05:36程序设计版块每日发帖之星
日期:2015-07-20 11:05:40数据库技术版块每日发帖之星
日期:2015-07-20 11:05:432015年辞旧岁徽章
日期:2015-07-20 11:05:44
164 [报告]
发表于 2010-10-03 22:23 |只看该作者
15、 JS下有一个字符串var str = '1|2|3|4|5|6#1|2|3|4#1|2|3|4|5|6|7|8'; 请用“#”号将其分割为数组,再用“|”将其分割为2维数组。可以用例如ary[0][0]这样的各式取出数组中的每个元素。最后输出其中最长数组的编号(1,2,3这样的自然数),这个数组中元素的个数。以及大数组中每个元素。如图:

  1. <script language=javascript>
  2. var str = '1|2|3|4|5|6#1|2|3|4#1|2|3|4|5|6|7|8';
  3. var arr=str.split("#");  //分割一维数组
  4. var arrtwo=new Array();
  5. for(var i=0;i<arr.length;i++){
  6.     arrtwo[i]=arr[i].split("|"); //分割二维数组。
  7. }
  8. var maxlength=arrtwo[0].length;
  9. var maxarr=1;
  10. //求二维数组最大长度和个数
  11. for (var i=1;i<arrtwo.length;i++){
  12.     if (maxlength < arrtwo[i].length){
  13.         maxlength = arrtwo[i].length;
  14.         maxarr=i+1;
  15.     }
  16. }
  17. document.write("最长的二维数组是:"+maxarr);
  18. document.write("<br>长度为:" + maxlength);
  19. //打印数组
  20. for (var i=0;i<arrtwo.length;i++){
  21.     document.write("<br>");
  22.     for (var j = 0;j<arrtwo[i].length;j++){
  23.         document.write(arrtwo[i][j]+",");
  24.     }
  25. }
  26. </script>
复制代码

论坛徽章:
0
165 [报告]
发表于 2010-10-03 22:43 |只看该作者

三十四.用写一个类实现会员管理,要求实现:
1)用文件存储会员信息,会员注册输入用户名和电子邮件就行。   
2)用户信息包括:用户名,电子邮件。
3)要求用户可以登录、退出和注销用户。
4)如果用户没有退出,下次登录自动显示用户名。
5)保存用户上次浏览时间。
  1. class User {
  2.         private $error = null;  //出错信息
  3.         const DATA_FILE = './data.file';  //用户数据文件
  4.         const SEPARATOR = "\t";   //数据行分隔符
  5.        
  6.         public function __construct() {
  7.                 if(!$this->getIsLogin()) {
  8.                         if($_COOKIE['user']) { //用户没退出
  9.                                 $cookie = @unserialize($_COOKIE['user']);
  10.                                 if(isset($cookie['name']) && isset($cookie['email'])) {
  11.                                         !$this->login($cookie['name'],$cookie['email']) && $this->logout();
  12.                                 }
  13.                         }
  14.                 }
  15.         }
  16.         /**
  17.          * 用户登陆
  18.          * @param unknown_type $userName
  19.          * @param unknown_type $email
  20.          */
  21.         public function login($userName,$email) {
  22.                 if($this->getIsLogin()) {
  23.                         return true;
  24.                 }
  25.                
  26.                 $find = $this->getUser($userName,$email);//寻找某用户
  27.                 if(!$find) {
  28.                         $this->error = 'no user';
  29.                         return false;
  30.                 }
  31.                 $lastView = $find['last_view'];
  32.                 $content = file_get_contents(self::DATA_FILE);
  33.                 //更新访问时间
  34.                 file_put_contents(self::DATA_FILE,str_replace($userName.self::SEPARATOR.$email.self::SEPARATOR.$lastView,$userName.self::SEPARATOR.$email.self::SEPARATOR.time(),$content));
  35.                 $lastView = $find['last_view'];
  36.                 $cookie = array();
  37.                 $cookie['user']['name'] = $_SESSION['user_name'] = $userName;//用session保存登陆用户信息
  38.                 $cookie['user']['email'] = $_SESSION['email'] = $email;
  39.                 $_SESSION['last_view'] = $lastView;
  40.                 setcookie('user',@serialize($cookie),time()+14400);//生成cookie
  41.                 return true;
  42.         }
  43.         /**
  44.          * 用户注册
  45.          * @param  $username
  46.          * @param  $email
  47.          */
  48.         public function register($username,$email) {
  49.                 $this->format($username,$email);
  50.                 if(!$username || !$email) {
  51.                         $this->error = 'no user or no email';
  52.                         return false;
  53.                 }
  54.                 if($this->getIsLogin()) {
  55.                         $this->error = 'has logined';
  56.                         return false;
  57.                 }
  58.                 if($this->getUser($username,$email)) {
  59.                         $this->error = 'registered by another';
  60.                         return false;
  61.                 }
  62.                 try {
  63.                         $f = fopen(self::DATA_FILE,'a');
  64.                         flock($f,LOCK_EX);
  65.                         fwrite($f,$username.self::SEPARATOR.$email.self::SEPARATOR.time()."\n");//写入一行
  66.                         flock($f,LOCK_UN);
  67.                 }
  68.                 catch (Exception $e) {
  69.                         fclose($f);
  70.                         $this->error = $e->getMessage();
  71.                         return false;
  72.                 }
  73.                 fclose($f);
  74.                 return true;
  75.         }
  76.         /**
  77.          * 寻找用户,找到返回用户信息,找不到返回false;
  78.          * @param $username
  79.          * @param $email
  80.          */
  81.         public function getUser($username,$email) {
  82.                 $this->format($username,$email);
  83.                 try {
  84.                         $f = fopen(self::DATA_FILE,'r');
  85.                         if ($f) {
  86.                             while (!feof($f)) {
  87.                                 $buffer = fgets($f, 4096);
  88.                                 list($username1,$email1,$time1) = explode(self::SEPARATOR,$buffer);
  89.                                 if($username1 == $username && $email1 == $email) {
  90.                                         return array('user_name'=>$username1,'email'=>$email1,'last_view'=>$time1);
  91.                                 }
  92.                             }
  93.                             fclose($f);
  94.                         }
  95.                 }
  96.                 catch (Exception $e) {
  97.                         fclose($f);
  98.                         return false;
  99.                 }
  100.                 return false;
  101.         }
  102.         /**
  103.          * 规范化字符串
  104.          * @param $user
  105.          * @param $email
  106.          */
  107.         public function format(&$user,&$email) {
  108.                 $username = str_replace(self::SEPARATOR,'',trim($username));
  109.                 $email = str_replace(self::SEPARATOR,'',trim($email));
  110.         }
  111.         /**
  112.          * 退出:清除session和cookie
  113.          */
  114.         public function logout() {
  115.                 unset($_SESSION['user_name']);
  116.                 unset($_SESSION['email']);
  117.                 unset($_SESSION['last_view']);
  118.                 setcookie('user','',time()-1);
  119.         }
  120.         /**
  121.          * 获取是否登陆
  122.          */
  123.         public function getIsLogin() {
  124.                 if($_SESSION['user_name']) {
  125.                         return true;
  126.                 }
  127.                 return false;
  128.         }
  129.         /**
  130.          * 获取错误信息
  131.          */
  132.         public function getError() {
  133.                 return $this->error;
  134.         }
  135. }
复制代码

论坛徽章:
59
2015七夕节徽章
日期:2015-08-24 11:17:25ChinaUnix专家徽章
日期:2015-07-20 09:19:30每周论坛发贴之星
日期:2015-07-20 09:19:42ChinaUnix元老
日期:2015-07-20 11:04:38荣誉版主
日期:2015-07-20 11:05:19巳蛇
日期:2015-07-20 11:05:26CU十二周年纪念徽章
日期:2015-07-20 11:05:27IT运维版块每日发帖之星
日期:2015-07-20 11:05:34操作系统版块每日发帖之星
日期:2015-07-20 11:05:36程序设计版块每日发帖之星
日期:2015-07-20 11:05:40数据库技术版块每日发帖之星
日期:2015-07-20 11:05:432015年辞旧岁徽章
日期:2015-07-20 11:05:44
166 [报告]
发表于 2010-10-04 21:16 |只看该作者
后面的不太会做了。呵呵。慢慢来。

论坛徽章:
0
167 [报告]
发表于 2010-10-04 21:50 |只看该作者
哇, 还有时间阿,  一会过来凑个热闹

论坛徽章:
0
168 [报告]
发表于 2010-10-05 03:33 |只看该作者
环境:
$ lsb_release -a
No LSB modules are available.
Distributor ID:        Ubuntu
Description:        Ubuntu 10.04.1 LTS
Release:        10.04
Codename:        lucid

$ php --version
PHP 5.3.2-1ubuntu4.5 with Suhosin-Patch (cli) (built: Sep 17 2010 13:41:55)
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies

运行方式: $ php -f name.php

第2题

  1. <?php
  2. // search number using binary search
  3. // the array index from zero to sizeof($array)-1
  4. function binary_search($list, $num)
  5. {
  6.     $low = 0;
  7.     $high = sizeof($list)-1;
  8.     $mid = (int)(($low+$high)/2);
  9.     while ($high >= $low) {
  10.         if ($num > $list[$mid]) {
  11.             $low = $mid + 1;
  12.         } elseif ($num < $list[$mid]) {
  13.             $high = $mid - 1;
  14.         } else {
  15.             return $mid;
  16.         }   
  17.         $mid = (int)(($low + $high)/2);
  18.     }   
  19.     return -1;
  20. }

  21. // read input from in.txt
  22. $filename = "in.txt";
  23. $fd = fopen($filename, "r") or exit("Unable open file [$filename]");
  24. if (!feof($fd)) {
  25.     $num = (int)fgets($fd);
  26. }
  27. if (!feof($fd)) {
  28.     $list = explode(' ', fgets($fd));
  29. }
  30. fclose($fd);

  31. // get result
  32. $result = binary_search($list, $num);

  33. // write result to out.txt
  34. $filename = "out.txt";
  35. $fd = fopen($filename, "w") or exit("Unable open file [$filename]");
  36. fwrite($fd, $result);
  37. fclose($fd);
复制代码
第4题

  1. <?php
  2. function bubble_sort($list)
  3. {
  4.     $len = sizeof($list);
  5.     for ($i = 0; $i < $len; $i++) {
  6.         for ($j = $i; $j < $len; $j++) {
  7.             if ($list[$i] > $list[$j]) {
  8.                 $tmp = $list[$i];
  9.                 $list[$i] = $list[$j];
  10.                 $list[$j] = $tmp;
  11.             }   
  12.         }   
  13.     }   
  14.     return $list;
  15. }

  16. function quick_sort($list, $low, $high)
  17. {
  18.     $i = $low;
  19.     $j = $high;

  20.     if ($low > $high)
  21.         return;

  22.     $tmp = $list[$low];

  23.     while ($i != $j) {
  24.         while ($list[$j] >= $tmp and $j > $i)
  25.             $j--;
  26.         if ($j > $i)
  27.             $list[$i++] = $list[$j];

  28.         while ($list[$i] <= $tmp and $j > $i)
  29.             $i++;
  30.         if ($j > $i)
  31.             $list[$j--] = $list[$i];
  32.     }
  33.     $list[$i] = $tmp;
  34.     quick_sort($list, $low, $i-1);
  35.     quick_sort($list, $i+1, $high);
  36. }

  37. $list = array(1, 20, 2, 6, 0, 10);
  38. print_r(bubble_sort($list));
  39. print_r(quick_sort($list, 0, sizeof($list)-1));
  40. ?>
复制代码

论坛徽章:
0
169 [报告]
发表于 2010-10-05 03:34 |只看该作者
第6题

  1. <?php
  2. function sum_iter($list)
  3. {
  4.     $result = array();
  5.     for ($i = 0; $i < sizeof($list); $i++) {
  6.         for ($j = $i; $j < sizeof($list); $j++) {
  7.             $result[$i][$j] = $list[$i] + $list[$j];
  8.         }   
  9.     }   
  10.     return $result;
  11. }

  12. $list = array(1, 2, 3);
  13. print_r(sum_iter($list));
  14. $list = array(1, 2, 3, 4);
  15. print_r(sum_iter($list));
  16. ?>
复制代码

论坛徽章:
0
170 [报告]
发表于 2010-10-05 03:35 |只看该作者
第15题

  1. <?php
  2. function getmax($list)
  3. {
  4.     $max_so_far = sizeof($list[0]);
  5.     $index = -1;
  6.     for ($i = 1; $i < sizeof($list); $i++) {
  7.         if ($max_so_far < sizeof($list[$i])) {
  8.             $index = $i;
  9.             $max_so_far = sizeof($list[$i]);
  10.         }   
  11.     }   
  12.     return $index;
  13. }

  14. $str = '1|2|3|4|5|6#1|2|3|4#1|2|3|4|5|6|7|8';
  15. $arr = explode('#', $str);
  16. $res = array();
  17. $length = array();
  18. for ($i = 0; $i < sizeof($arr); $i++) {
  19.     $res[$i] = explode('|', $arr[$i]);
  20.     $length[$i] = sizeof($res[$i]);
  21. }

  22. $index = getmax($res);
  23. $len = sizeof($res[$index]);
  24. $index++;
  25. print "最长的二维数组是:$index\n";
  26. print "长度为:$len\n";
  27. for ($i = 0; $i < sizeof($res); $i++) {
  28.     print implode(',', $res[$i]) . "\n";
  29. }
  30. ?>
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP