有5個人偷了一堆蘋果,準備在第二天分贓。晚上,有一人遛出來,把所有菜果分成5份,但是多了一個,順手把這個扔給樹上的猴了,自己先拿1/5藏了。沒想到其他四人也都是這麼想的,都如第一個人一樣分成5份把多的那一個扔給了猴,偷走了1/5。第二天,大家分贓,也是分成5份多一個扔給猴了。最後一人分了一份。問:共有多少蘋果?
for ($i = 1; ; $i++)
{
if ($i%5 == 1) {
//第一個人取五分之一,還剩$t
$t = $i - round($i/5) - 1;
if($t % 5 == 1)
{
//第二個人取五分之一,還剩$r
$r = $t - round($t/5) - 1;
if($r % 5 == 1)
{
//第三個人取五分之一,還剩$s
$s = $r - round($r/5) - 1;
if($s % 5 == 1)
{
//第四個人取五分之一,還剩$x
$x = $s - round($s/5) - 1;
if($x % 5 == 1)
{
//第五個人取五分之一,還剩$y
$y = $x - round($x/5) - 1;
if ($y % 5 == 1) {
echo $i;
break;
}
}
}
}
}
}
}
一羣猴子排成一圈,按1,2,…,n依次編號。然後從第1只開始數,數到第m只,把它踢出圈,從它後面再開始數,再數到第m只,在把它踢出去…,如此不停的進行下去,直到最後只剩下一隻猴子爲止,那隻猴子就叫做大王。要求編程模擬此過程,輸入m、n, 輸出最後那個大王的編號。
function king($n, $m){
$monkeys = range(1, $n);
$i=0;
$k=$n;
while (count($monkeys)>1) {
if(($i+1)%$m==0) {
unset($monkeys[$i]);
} else {
array_push($monkeys,$monkeys[$i]);
unset($monkeys[$i]);
}
$i++;
}
return current($monkeys);
}
$a = king(5, 2);
var_dump($a);
漢諾塔(又稱河內塔)問題是印度的一個古老的傳說。開天闢地的神勃拉瑪在一個廟裏留下了三根金剛石的棒,第一根上面套着64個圓的金片,最大的一個在底下,其餘一個比一個小,依次疊上去,廟裏的衆僧不倦地把它們一個個地從這根棒搬到另一根棒上,規定可利用中間的一根棒作爲幫助,但每次只能搬一個,而且大的不能放在小的上面。解答結果請自己運行計算,程序見尾部。面對龐大的數字(移動圓片的次數)18446744073709551615,看來,衆僧們耗盡畢生精力也不可能完成金片的移動。
後來,這個傳說就演變爲漢諾塔遊戲:
1.有三根杆子A,B,C。A杆上有若干碟子
2.每次移動一塊碟子,小的只能疊在大的上面
3.把所有碟子從A杆全部移到C杆上
經過研究發現,漢諾塔的破解很簡單,就是按照移動規則向一個方向移動金片:
如3階漢諾塔的移動:A→C,A→B,C→B,A→C,B→A,B→C,A→C
此外,漢諾塔問題也是程序設計中的經典遞歸問題。
function hanoi($n,$x,$y,$z){
if($n==1){
echo 'move disk 1 from '.$x.' to '.$z."\n";
}else{
hanoi($n-1,$x,$z,$y);
echo 'move disk '.$n.' from '.$x.' to '.$z."\n";
hanoi($n-1,$y,$x,$z);
}
}
hanoi(3,'A','B','C');