PHP简单的运算题

首页 编程分享 PHP丨JAVA丨OTHER 正文

袅袅牧童 转载 编程分享 2019-05-07 07:27:31

简介 PHP简单的运算题,来源:《CSDN》


1:100盏灯开关:

大厅里有100盏灯,每盏灯都编了号码,分别为1-100。每盏灯由一个开关来控制。(开关按一下,灯亮,再按一下灯灭。开关的编号与被控制的灯相同。)开始时,灯是全灭的。现在按照以下规则按动开关。
第一次,将所有的灯点亮。
第二次,将所有2的倍数的开关按一下。
第三次,将所有3的倍数的开关按一下。
以此类推。第N次,将所有N的倍数的开关按一下。
问第100次按完以后,大厅里还有几盏灯是亮的。

//  方法1:双重for循环,外层控制,第1次...第100次;内层控制100盏灯;每次中,从1到100盏灯哪些灯发生变化;  
  1.   
  2. $arr = array_fill(1,100,0);          // 构造100盏灯;  初始:等全部灭的,用0代替;  0表示灯灭;  
  3.                                        
  4. $cishu = 1;  
  5.   
  6. for($cishu = 1;$cishu<=100;){       // 从第一次到第100次;  
  7.   
  8.     for($i = 1;$i<=100;$i++){       //  从第1盏灯到第100盏灯;  
  9.           
  10.         if($i%$cishu==0){           // 从100盏灯中依次找出,判断找出符合改变状态的灯;        
  11.               
  12.             $arr[$i] = ~($arr[$i]);    // 改变 符合条件的灯 的状态。 (注意:0取反的结果是-1,-1再取反又是0);  
  13.               
  14.         }  
  15.     }  
  16.       
  17.     $cishu++;                 // 第$cishu次运行结束,再循环$cishu+1次,根据条件,改变每盏灯的变化;  
  18.   
  19. }  
  20.   
  21. for($i = 1;$i<=100;$i++){  
  22.       
  23.     if($arr[$i]==-1){       // 0的取反是-1;所以状态是-1的时候,表示灯在亮着;  
  24.           
  25.         echo $i;  
  26.         echo '<br/>';  
  27.     }  
  28. }  
//  方法2:外层循环依旧用for循环来逐一运行每一次; 内层循环利用foreach,遍历出每盏灯的健名和状态(值);  
  1.   
  2. $arr = array_fill(1,100,0);          // 构造100盏灯;  初始:等全部灭的,用0代替;  0表示灯灭;  
  3.                                        
  4. $cishu = 1;  
  5.   
  6. for($cishu = 1;$cishu<=100;$cishu++){  
  7.       
  8.     foreach($arr as $keys => $values){  
  9.           
  10.         if($keys%$cishu==0){  
  11.               
  12.             //① :$arr[$keys] = ($values==0)?1:0;  三目运算的方法:(成不成立?1:0)  
  13.               
  14.             $arr[$keys] = $values ^ 1;    //异或(位)运算; (0^1==1;1^1==0);  ②;  
  15.               
  16.             //③ : arr[$keys] = $values+1   // 每次的值(状态)都加1,(0关,1开,2关,3开,4关,5开,6关...最后被2整数余1的表示状态 开);  
  17.               
  18.             /***   ④    ** 
  19.              
  20.             条件判断,赋值改变法;类似于 上面的三目运算; 
  21.              
  22.             if($values==0){ 
  23.                  
  24.                 $arr[$keys] = 1; 
  25.             }else{ 
  26.                  
  27.                 $arr[$keys] = 0; 
  28.             } 
  29.              
  30.            ********/  
  31.         }  
  32.     }  
  33.       
  34. }  
  35.   
  36.   
  37. foreach($arr as $keys=>$values){  
  38.       
  39.     if($values==1){  
  40.           
  41.         echo $keys.'====>'.$values;//(值表示状态,都为1表示开着,健名表示灯的标号,哪些标号的灯开着最后);  
  42.         echo '<br/>';  
  43.     }  
  44. }  

2:逢三退一:

有10个人(编号1-10) 围成一个圈 从第一个开始数 数到三 踢出这个人 然后接着往下循环数! 直到剩下一个人为止! 问最后剩下的那个人的编号是几?

// 方法1 :假设原先有10个人,都为true,数到3的时候,那个人变为false,最后剩余的那个true就为所求的;  
  1.   
  2.   
  3. $tenarr = array_fill(1,10,true);    // 构造10个人,初始都标识为true;  
  4.   
  5. $jishu = 0;                        // 计数初始为0,数到3后,再重新开始;  
  6.   
  7. $keys = 1;                        // 数组下标初始为1,到10结束;  
  8.   
  9. $truegeshu = count($tenarr);     //  标识为true的个数,初始为10,数到3的时候,减一;  
  10.   
  11. while($truegeshu>1){  
  12.       
  13.     if($tenarr[$keys]==true){      // 如果标识是ture,说明还在圈中;  
  14.           
  15.         $jishu++;  
  16.         if($jishu==3){               //数到3的时候;  
  17.             $jishu = 0;              //  重新下一次计数,初始;  
  18.             $tenarr[$keys]=false;    //   将标记true变成false; 退出;  
  19.             $truegeshu--;          //   标识为true的个数少一个;            
  20.         }  
  21.     }  
  22.       
  23.     $keys++;                       // 进入下一个数;  
  24.     if($keys>count($tenarr)){   // 如果下标的值,大于总个数的时候,(从1开始的,即:$keys>10);  
  25.     // $keys=count($tenarr)+1  
  26.        $keys = 1;                  // 假如下标数到11的时候,超过了10个总数,从1继续开始;    
  27.     }  
  28. }  
  29.   
  30.   
  31. foreach($tenarr as $ks=>$vs){  
  32.       
  33.     if($vs==true){  
  34.         echo $ks;         // 4;  数组的下标从1开始设置并计算的;     
  35.     }  
  36. }  

// 方法2 :利用php数组特性处理;  
  1.   
  2. $arr2 = range(1,10);    //构造一个数组,值代表10个人以及对应的编号;  
  3.   
  4. $jishu = 0;             // 计数器;初始为0,到3还原;  
  5.   
  6. while(count($arr2)>1){  
  7.       
  8.     foreach($arr2 as $keys=>$values){  
  9.           
  10.         $jishu++;  
  11.         if($jishu==3){  
  12.               
  13.             unset($arr2[$keys]);       // 直接从数组中,剔除出去;  
  14.             $jishu = 0;  
  15.         }  
  16.     }  
  17. }  
  18.   
  19. print_r($arr2);       // Array ( [3] => 4 );  原数组中,只剩1个数值;  

// 方法3: 利用aarray_splice()函数去除,改变原数组的值以及下标;(只去除,没有替换);  
  1.   
  2. $arr3=array('1','2','3','4','5','6','7','8','9','10');  
  3.   
  4. function leftOne($arr) {  
  5.           
  6.     $num = count($arr);  
  7.     $count = 0;  
  8.     for ($j = 0; $j < $num$j++) {  
  9.         $count++;                 
  10.         $diff = count($arr);  
  11.         if (2*$count >= $diff) {     
  12.             array_splice($arr, 2*$count - $diff, 1);  
  13.             $count = 0;  
  14.         }else {  
  15.             array_splice($arr, 2*$count, 1);  
  16.         }  
  17.     }  
  18.       return $arr[0];  
  19. }  
  20.   
  21. echo leftOne($arr3);  

3:小球落地:

一球从100米高度自由落下,每次落地后反跳回原高度的一半,再落下,求它在第10次落地时,共经历多少米,第10次反弹多高?

   $s = 100;     // 第一次从100米开始落地;  
  1. $h = 50;      // 从反弹的高度h=50开始,一个周期为 2*h;  
  2.   
  3. for($i=2;$i<=10;$i++){                   //  从第一次落地后反弹,到第二次落地是一个循环周期;   反弹的高度$h = 50;  
  4.    
  5.  $s = $s+2*$h;  
  6.  $h = $h/2;  
  7. }  
  8.      
  9. echo $s;  
  10. echo $h;  

4:取各不相同的牌:

有9张牌每张是不一样的,在里面任意取3张,且3张牌中各不相同,一共有多少种取法?

$kk= 0;  
  1.   
  2. for($i = 0;$i<=8;$i++){  
  3.       
  4.     for($j = $i;$j<=8;$j++){  
  5.           
  6.         for($k = $j;$k<=8;$k++){  
  7.               
  8.               if(($i!=$j)&&($j!=$k)&&($i!=$k)){  
  9.                     
  10.                   $kk++;  
  11.               }   
  12.         }  
  13.     }  
  14.       
  15. }  
  16.   
  17. echo $kk;  

5:乒乓比赛匹配:

两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。

for($i = 1;$i<=3;$i++){                      // $i a的对手,从xyz(1,2,3)中选其中一个;  
  1.       
  2.     for($j = 1;$j<=3;$j++ ){                // $j b的对手,从xyz(1,2,3)中选其中一个;  
  3.           
  4.         for($k = 1;$k<=3;$k++){            //  $k b的对手,从xyz(1,2,3)中选其中一个;  
  5.               
  6.             if(($i!=1)&&($k!=1)&&($k!=3)&&($i!= $j)&&($i!= $k)&&($j!= $k)){    // 还需要保证 abc的对手不能有相同的,(一个人不能参加两场比赛);  
  7.                   
  8.                 echo 'a'.'-----'.$i;             //  a-----3;  
  9.                 echo 'b'.'-----'.$j;             //  b-----1;  
  10.                 echo 'c'.'-----'.$k;             //  c-----2;  
  11.                   
  12.             }  
  13.               
  14.         }  
  15.           
  16.     }      
  17.       
  18. }  

6:猴子搬香蕉:

一只猴子旁边有100根香蕉,猴子离家50米;一次最多搬50根香蕉;但猴子每走1米就要吃掉1根香蕉,问猴子最多能拿回家多少香蕉?

$xiangjiao = 100;  
  1.   
  2. for($juli =1;$juli<=50;$juli++){  
  3.        
  4.     if($xiangjiao>=50){  
  5.         $xiangjiao -= 3;   
  6.     }else{  
  7.         $xiangjiao -= 1;   
  8.     }  
  9.     echo '走到第'.$juli.'米时','香蕉剩余'.$xiangjiao;  
  10.     echo '<br/>';   
  11. }  

7:规律数字求和:

一组数字 1,1,2,3,5,8,13.........求其前20项的和;

// 方法1:利用迭代、替换求和;  
  1.   
  2. $a = 1;  
  3.   
  4. $b = 1;  
  5.   
  6. $s = 2;  
  7.   
  8. $m = 0;  
  9.   
  10. for($i=3;$i<=20;$i++){  
  11.       
  12.     $m = $a+$b;  
  13.     $s = $s+$m;  
  14.       
  15.     $a = $b;  
  16.     $b = $m;  
  17.       
  18. }  
  19.   
  20. echo $s;     //  17710;  
  21.   
  22. // 方法2:利用函数递归,得出每一项的值,然后求和;  
  23.   
  24. function qiuhe($n){  
  25.       
  26.     if($n>2){  
  27.           
  28.         return qiuhe($n-1)+qiuhe($n-2);  
  29.           
  30.     }  
  31.       
  32.     if($n=2){  
  33.           
  34.         return 1;  
  35.     }  
  36.       
  37.     if($n=1){  
  38.           
  39.         return 1;  
  40.     }  
  41.       
  42. }  
  43.   
  44. $sum = 0;  
  45.   
  46. for($i=1;$i<=20;$i++){  
  47.       
  48.     $sum += qiuhe($i);    
  49. }  
  50.   
  51. echo $sum;          // 17710;  
  52.   
  53.   
  54. // 方法3:利用数组,算出每个元素的值,然后求和;  
  55.   
  56. $arr[0] = $arr[1] = 1;  
  57.   
  58. for($i=2;$i<20;$i++){  
  59.       
  60.     $arr[$i] = $arr[$i-1] + $arr[$i-2];  
  61. }  
  62.   
  63. echo array_sum($arr);   //  17710;  



8:百钱白鸡:

公鸡5文钱一只,母鸡3文钱一只,小鸡3只一文钱,用100文钱买一百只鸡,其中公鸡,母鸡,小鸡都必须要有,问公鸡,母鸡,小鸡要买多少只刚好凑足100文钱。

for($x=1;$x<20;$x++){   // 公鸡x只;  
  1.     
  2.   for($y=1;$y<34;$y++){   // 母鸡y只;  
  3.      
  4.     $z = 100- $x - $y;     // 母鸡z只;   
  5.       
  6.     if((5*$x + 3*$y + $z/3) == 100){  
  7.           
  8.         echo '公鸡'.$x.'只'.'    '.'母鸡'.$y.'只'.'    '.'小鸡'.$z.'只'.'    ';  
  9.         echo '<br/>';  
  10.     }  
  11.       
  12.   }  
  13.       
  14. }  

8:过路口问题:

假设某人有100,000现金。每经过一次路口需要进行一次交费。交费规则为当他现金大于50,000时每次需要交5%如果现金小于等于50,000时每次交5,000。请写一程序计算此人可以经过多少次这个路口。

//  while循环方法;  
  1.   
  2. $money = 100000;  
  3.   
  4. $lukou = 0;  
  5.   
  6. while($money > 5000){  
  7.       
  8.     if($money > 50000){  
  9.         $money *= 0.95;  
  10.     }else{  
  11.         $money -= 5000;  
  12.     }  
  13.       
  14.     $lukou++;  
  15.       
  16.     echo '过了'.$lukou.'个路口','钱还剩于'.$money;  
  17.     echo '<br/>';  
  18. }  
  19.   
  20.   
  21. //  for循环方法; for(初始化;循环语句;执行循环后语句)  
  22.   
  23. for($money = 100000,$num=0;$money >= 5000;$num++) {  
  24.     if($money > 50000) {  
  25.         $money *= 0.95; // 扣了5%,即原来的0.95倍  
  26.     } else {  
  27.         $money -= 5000;  
  28.     }  
  29. }  
  30.   
  31. echo $num;  

9:猴子吃桃问题:

猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。

  1. //   第10天剩余1个,第9天的时候开始剩余4个(吃了3个);第8天的时候开始剩余10个(吃了6个);...  
  2.   
  3. $sheng = 1;  
  4.   
  5. for($i = 9;$i > 0;$i--){  
  6.     $sheng = 2*($sheng+1);  
  7. }  
  8. echo $sheng;    //  1534;  

9:人分苹果问题:

有5个人偷了一堆苹果,准备在第二天分赃。晚上,有一人遛出来,把所有菜果分成5份,但是多了一个,顺手把这个扔给树上的猴了,自己先拿1/5藏了。没想到其他四人也都是这么想的,都如第一个人一样分成5份把多的那一个扔给了猴,偷走了1/5。第二天,大家分赃,也是分成5份多一个扔给猴了。最后一人分了一份。问:共有多少苹果?

for ($i = 1; ; $i++)  
  1. {  
  2.     if ($i%5 == 1) {  
  3.         //第一个人取五分之一,还剩$t  
  4.         $t = $i - round($i/5) - 1;        
  5.         if($t % 5 == 1)  
  6.         {  
  7.             //第二个人取五分之一,还剩$r  
  8.             $r = $t - round($t/5) - 1;        
  9.             if($r % 5 == 1)  
  10.             {  
  11.                 //第三个人取五分之一,还剩$s  
  12.                 $s = $r - round($r/5) - 1;                
  13.                 if($s % 5 == 1)  
  14.                 {  
  15.                     //第四个人取五分之一,还剩$x  
  16.                     $x = $s - round($s/5) - 1;                    
  17.                     if($x % 5 == 1)  
  18.                     {  
  19.                         //第五个人取五分之一,还剩$y  
  20.                         $y = $x - round($x/5) - 1;                        
  21.                         if ($y % 5 == 1) {  
  22.                             echo $i;  
  23.                             break;  
  24.                         }    
  1.                     }  
  2.                 }  
  3.             }  
  4.         }  
  5.     }  
  6. }  

Tags:


本篇评论 —— 揽流光,涤眉霜,清露烈酒一口话苍茫。


    声明:参照站内规则,不文明言论将会删除,谢谢合作。


      最新评论




ABOUT ME

Blogger:袅袅牧童 | Arkin

Ido:PHP攻城狮

WeChat:nnmutong

Email:nnmutong@icloud.com

标签云