C语言 5猴分桃求思路

Python012

C语言 5猴分桃求思路,第1张

假如原来有a个桃子第1只猴子拿完后剩(a-1)4/5

[(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 n,k,t=0// t代表分配的次数,n只猴子,k个桃子

bool fun(int m)

{

if(m<=k) return false//如果当前猴子可分配的桃子少于k个,返回false

if(m%n != k) return false//如果当前的桃子%n !=k,返回false

t++//当前猴子可分配桃子

if(t>=n) return true//分配了n次,满足条件退出

if(!fun(m-k-m/n)) return false// 下一个猴子可以分m-k-m/n只桃子

return true//以上条件都满足,返回true

}

int main()

{

scanf("%d%d", &n, &k)

if(n==1) {printf("%d",1+k)return 0} // 如果只有1只猴子,直接输出,退出

for(int i=1i++)

{

t = 0//每次循环重新计数

int m = n*i + k//不要直接让m从1开始循环。反正m肯定%n ==k

if(fun(m))

{

printf("%d", m)

break

}

}

return 0

}

测了几组数据,比如2个猴子1个桃子,就是7。上述程序对于只有1个猴子的时候有问题,但是将m只桃子分成1等份剩余k个这样是否有意义呢?

如果有的话,那么如果只有一只猴子,直接输出1+k就可以了。