抱歉,评论被关闭
偷苹果引发的思考
网上搜一下算法来看哈,就看到喵了个咪博客 有一个算法题如下:
5个人偷了一堆苹果,准备在第二天分赃。晚上,有一人遛出来,把所有菜果分成5份,但是多了一个,顺手把这个扔给树上的猴了,自己先拿1/5藏了。没想到其他四人也都是这么想的,都如第一个人一样分成5份把多的那一个扔给了猴,偷走了1/5。第二天,大家分赃,也是分成5份多一个扔给猴了。最后一人分了一份。问:共有多少苹果?
<?php function apple(){ $re=0; for($i=1;;$i++){ if($i%5==1){ $a=$i-round($i/5)-1; if($a%5==1){ $b=$a-round($a/5)-1; if($b%5==1){ $c=$b-round($b/5)-1; if($c%5==1){ $d=$c-round($c/5)-1; if($d%5==1){ $e=$d-round($d/5)-1; if($e%5==1){ $re=$i; break; } } } } } } } return $re; } /** /*重构 函数apple 并且新增人数变量参数 /*@param $people 偷苹果总人数 /*@return $re 偷苹果总数 **/ function appleRec($people){ $re=0; $flag=FALSE; for($i=1;;$i++){ $j=$people; $a=$i; for($j;$j>=0;$j--){ if($a%$people==1){ $a=$a-intval($a/$people)-1; $flag=TRUE; }else{ $flag=FALSE;break; } } if($flag){$re=$i;break;} } return $re; } $s=microtime(true); echo "5个人分的apple总数为:".apple()."<br>"; $e=microtime(true)-$s; echo "apple所用时间:".$e."<br><br>"; $s=microtime(true); $people=5; echo "{$people}个人分的apple总数为:".appleRec($people)."<br>"; $e=microtime(true)-$s; echo "appleRec所用时间:".$e."<br>";
//结果:/*5个人分的苹果总数为:15621 apple函数所用时间:0.0039300918579102 5个人分的苹果总数为:15621 appleRec函数所用时间:0.0062911510467529*/总结:我重构了一下apple,appleRec 明显效率低下,因为for比if效率要低,并且通过测试发现intval效率比较round高很多。
所以对于他的算法还可以优化一下把round改写成intval.
如果这个题目改写一下5个人改写n个人(也许是6、7) 那明显用apple实用性不强,appleRec 通过测试
7个人分的苹果总数为:5764795
appleRec所用时间:2.0439360141754是不是有点恐怖,这个appleRec不能很好的解决!
有木有更好的算法来解决这个问题呢?
本文出自 “凹凸曼” 博客,请务必保留此出处http://www.apoyl.com/?p=1376
日志信息 »
该日志于2012-06-13 10:56由 凹凸曼 发表在PHP分类下,
评论已关闭。
目前盖楼