问题:海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子平均分为五份,多了一个,这只 猴子把多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分成五份,又多了 一个,它同样把多的一个扔入海中,拿走了一份,第三、第四、第五只猴子都是这样做的, 问海滩上原来最少有多少个桃子?
#include <stdio.h>
#include <math.h>
int main()
{
const int monkey_num = 5;
int monkey = monkey_num;
int i = 1;
int peach = i;
while (monkey >= 1) //从第5只猴子开始倒着推算,一直推算到第1只猴子
{
if (peach % 4 == 0)
{
peach = peach / 4 * 5 + 1; //假设第n只猴子看到的桃子数是peach,那么上一只猴子看到的桃子数等于peach /4 * 5 + 1
monkey--;
}
else //如果倒推过程失败,那么试探新的peach值,并从第5只猴子开始重新倒推
{
peach = ++i;
monkey = monkey_num;
}
}
printf("original peach num:%d\n", peach);
return 0;
}
13只猴子,也能在几十毫秒算出结果:
如果个数再多,int要换成long long。
减少循环次数,程序速度还可以优化。
其实,仔细观察猴子和桃子的个数,可以发现两者之间有一个函数关系,可以直接根据猴子求得桃子个数~_~