作为程序员一定要保持良好的睡眠,才能好编程

php逻辑题

发布时间:2018-01-26


问题:现在共有100匹马跟100块石头,马分3种,大型马;中型马跟小型马。

其中一匹大马一次可以驮3块石头,中型马可以驮2块,

而小型马2头可以驮一块石头。问需要多少匹大马,中型马跟小型马?

(问题的关键是刚好必须是用完100匹马)

$big=0;
$zhongma=0;
$xiaoma=0;

for($big=1;$big<100;$big++){
  for($zhongma=1;$zhongma<100;$zhongma++){
    for($xiaoma=1;$xiaoma<100;$xiaoma++){
        $ma=$big+$zhongma+$xiaoma;
        $shitou=$big*3+$zhongma*2+$xiaoma/2;
        if($ma==100 && $shitou==100){
            echo "大马:{$big}   中马:{$zhongma}  小马:{$xiaoma}"."<br>";
        }
    }      
  }
}


执行结果:

大马:2 中马:30 小马:68
大马:5 中马:25 小马:70
大马:8 中马:20 小马:72
大马:11 中马:15 小马:74
大马:14 中马:10 小马:76
大马:17 中马:5 小马:78


这个题是非常简单的,调用三层循环即可



  @param int $n 开始时的猴子数量 
  @param int $m 报道的最后一个数 
 (报到这个数的猴子被淘汰,然后下一个猴子重新从①开始报数)  
  @return int 猴子的初始编号


/** 
 * @param int $n 开始时的猴子数量 
 * @param int $m 报道的最后一个数 
 *(报到这个数的猴子被淘汰,然后下一个猴子重新从①开始报数)  
 * @return int 猴子的初始编号  
 */
function monkeySelectKing($n,$m) 
{ 
 //猴子的初始数量不能小于2 
 if ($n<2) 
 { 
 return false; 
 } 
   
 $arr=range(1,$n); 
 //将猴子分到一个数组里, 数组的值对应猴子的初始编号 
 $unsetNum=0; 
 //定义一个变量,记录猴子的报数 
   
 for ($i = 2; $i <=$n*$m; $i++)
 //总的循环次数不知道怎么计算, 
 { 
 //不过因为循环中设置了return,所以$m*$len效率还可以 
 foreach ($arr as $k => $v) 
 { 
  $unsetNum++; //每到一个猴子, 猴子报数+1 
   
 //当猴子的报数等于淘汰的数字时:淘汰猴子(删除数组元素) 
 //报数归0(下一个猴子从1开始数) 
  if ($unsetNum==$m)  
  { 
 
  unset($arr[$k]);
  echo "<pre>";//打开注释,可以看到具体的淘汰过程 
  print_r($arr);
 //淘汰猴子   
  $unsetNum=0;
 //报数归零 
  if (count($arr)==1) 
 //判断数组的长度, 如果只剩一个猴子, 返回它的值 
  { 
   return reset($arr); 
  } 
  } 
 } 
 } 
} 
   
var_dump(monkeySelectKing(9,7));