五只猴子采得一堆桃子,半夜里第一只猴子偷偷起来把桃平均分成五分,发现还多一个,它吃了哪个桃子,还拿走其中的一份,第二只猴子起来又把桃子分成五分,还多一个,它吃了那个桃子,有拿走其中的一份,第三第四第五只猴子都如此做了,请问这堆桃子有多少个。
(新人)
在参考了一些经典解法、研究了该问题的过程后,以下为一些自认为较为简洁明白的解法程序
1.利用总式子为整数,进行枚举循环。
#include <stdio.h>
#include <stdlib.h>
int main()
{
double a=2;
int i,j,k;
for (i = 0; i < 3200; i++) //这里估计了一下大致范围
{
for (j = 0; j < 5; j++) //含义是对a进行题述处理,中间过程及结果必须是整数,以此为标准来判断
{
k = 0;
a = 0.8*(a - 1);
if ((a -(int)a)!=0 ) //判断整数
break;
k = 1;
}
if (k==1)
break;
a=3+i;
}
a = 2 + i; //注意,如果直接输出,结果是第五只猴子分后剩余的数量,同时,i已经多了1
printf("桃子数量为%.01lf", a); //double 一般对应lf
return 0;
}
当然,虽然个人认为这种较好理解,但总感觉结构比较拖沓。只是一种方向初步的想法,仅仅参考,并不是较为泛用的方法
2. 4 的倍数
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i=0,x, t;
for(x=4; i < 5;x=x+4)
{
t=x; //要注意此处容易漏掉,必须有交换,否则x=x+4中的x是进行迭代过后的x!!
for (i = 0; i < 5; i++)
{
if (t % 4 != 0)
break;
t = (t / 4) * 5 + 1;
}
}
printf("%d", t);
return 0;
}
最根本的依据确实很像:都是依据每次分桃后必为4的倍数,但处理过程有所不同。
想借此拓展一些附加功能,比如输出每次的执行结果,整理成表,探究不同形式的循环设置,再看看书中对于循环的讲解,拓宽应用的思路
3.看知乎还有人直接给了通项公式
还不会latex,直接打出来是y=n^n-n+1,n是猴子个数