[(a-1)4/5-1]4/5
{[(a-1)4/5-1]4/5-1}4/5
【{ [(a-1)4/源缓5-1]4/5-1}4/5-1】4/5
《【{ [(a-1)4/5-1]4/5-1}4/5-1】4/5-1》4/5
第五只拿玩后至少要大于等于4
解不等式《【{ [(a-1)4/5-1]4/5-1}4/5-1】4/雹薯模5-1》4/5>=4
求出a循环结束
哥们好,我来解释解释哈这个程序是倒着分析的:首先说的是s[n]为第n只猴子走后,留给其他每个猴子的桃子的数目。(当然燃源漏猴子都不知道前面的猴子已经拿过了),所以剩余桃子是s[5]*4,就是第五只猴子给其他每只猴子留下的桃子数目乘以4。
倒着推,第五只猴子先多吃了一个,再平分5份,并吃掉了自己的一部分,那么留下的s[5]其实肯定是4的倍皮烂数【这段代码其实可以优化一下】则留下的s[5]*5并加上1,就是第4个猴子留下的桃子总数,然后看下是否是4的倍数,因为这是第四个猴子留下的准备给其他4个猴子的桃子,肯定是4的倍数啦,如果不是就说明错误咯,,然后这个数再除以4,再乘以5,再加上1,就是第三只猴子留下的桃子总数,那肯定也是4的倍数啦。
以此类推,就能推到第一只猴子时的桃子数什么的,总数什么的,都出来啦
如果上面意思弄懂了,现在就说程序本身,先假设s[5]为1,然后看s[5]*5+1【裂闹就是第四只猴子留下的桃子数目】是否能被4整除,如果不能,就直接跳出循环,假设s[5]为2,再看s[5]*5+1能否被4整除,如果能被整除,就得到s[4]的值,【就是你 “s[4]
/=
4
//想知道这代码有什么用”的这段代码的意思】再乘以5,然后再加上1,就是第三只猴子留下的桃子数目,再看这个能否被4整除,如果不能,就直接跳出循环,再重新来啦
一直到s[1],最后s[0]就是所谓的总数目啦,
懂了吧,朋友?还没懂的话
就再继续探讨探讨哈
欢迎
#include<stdio.h>
int a(int num, int min_num, int ret)
{
if ((min_num - 1) % 5 == 0)
{
if (num == 5)
ret = 0
else
ret = a(num + 1, (min_num - 1) / 5 * 4, ret)
}
return ret
}
void main(void)
{
int min_num = 0,num = 1, ret = 1/罩激仿/物纤min_num最少桃铅肆子数;num猴子数
while (ret)
ret = a(num, ++min_num, ret)
printf("the min number is %d", min_num)
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)