算法:苹果问题

/**
* 题目:
* 有5个人偷了一堆苹果,准备在第二天分赃。晚上,有一人遛出来,把所有苹果分成5份,但是多了一个,顺手把这个扔给树上的猴了,自己先拿1/5藏了。
* 没想到其他四人也都是这么想的,都如第一个人一样分成5份把多的那一个扔给了猴,偷走了1/5。
* 第二天,大家分赃,也是分成5份多一个扔给猴了。最后一人分了一份。问:共有多少苹果?
*
* 思路:
* 假如最后还剩16个,则在最后一个人偷拿之前还剩16*(5/4) + 1 = 21,则可以看出,被上一个人偷之前和当前剩余苹果数的关系为:pre = current*(5/4)+1
* 设5个人偷拿后最后还剩下:current = 5n+1
* 可以推算第5个人偷拿之前还剩 current = current*(5/4)+1 = (5/4)*5n + (5/4) + 1
* 可以推算第4个人偷拿之前还剩 current = current*(5/4)+1 = (5/4)^2*5n + (5/4)^2 + (5/4) + 1
* 可以推算第3个人偷拿之前还剩 current = current*(5/4)+1 = (5/4)^3*5n + (5/4)^3 + (5/4)^2 + (5/4) + 1
* 可以推算第2个人偷拿之前还剩 current = current*(5/4)+1 = (5/4)^4*5n + (5/4)^4 + (5/4)^3 + (5/4)^2 + (5/4) + 1
* 可以推算第1个人偷拿之前还剩 current = current*(5/4)+1 = (5/4)^5*5n + (5/4)^5 + (5/4)^4 + (5/4)^3 + (5/4)^2 + (5/4) + 1
* 也就是说,一开始的苹果数为 : (5/4)^5*5n + (5/4)^5 + (5/4)^4 + (5/4)^3 + (5/4)^2 + (5/4) + 1,该值一定为整数
*
* @author wifi
*/
function StealingApples()
{
$i = 1;
$pow1 = 1.25;
$pow2 = 1.25 * $pow1;
$pow3 = 1.25 * $pow2;
$pow4 = 1.25 * $pow3;
$pow5 = 1.25 * $pow4;
while (true) {
$res = $pow5 * 5 * $i + ($pow5 + $pow4 + $pow3 + $pow2 + $pow1 + 1);
//判断是否为整数
if ($res - (int)$res == 0) {
echo $res;
break;
}
$i++;
}
}
posted @ 2020-12-12 18:41  横横竖横  阅读(148)  评论(0编辑  收藏  举报