C语言 猴子分桃问题。求用递归函数解

题目如下【问题描述】有1堆桃子共m个,由n只猴子分配这些桃子。每次到达桃子堆放地的猴子只有1只,而且每个猴子都会平均分1次桃子。第1只到达的猴子将桃子平均分成n等份,但发... 题目如下
【问题描述】
有1堆桃子共 m 个,由 n 只猴子分配这些桃子。每次到达桃子堆放地的猴子只有1只,而且每个猴子都会平均分 1 次桃子。
第1只到达的猴子将桃子平均分成 n 等份,但发现多 k ( k < n )个,于是,将多余的k个扔掉,然后拿走其中的1份。
第2只猴子同样将剩余的桃子又分成 n 等份,也发现多 k 个,并同样将多余的 k 个扔掉,然后拿走其中1份。
之后的每只猴子都这样(将剩余的桃子又分成 n 等份,也发现多 k 个,并将多余的 k 个扔掉,然后拿走其中1份)。
现在假设最后一只猴子分配后至少可以拿走1个桃子,请根据输入的 n 和 k值,编程计算最小的 m。(比如,n=3,k=1,则最小的m是25,最后一个分得3个)
【输入】
输入由键盘输入,共1行
这一行由两个整数n和k组成,分别代表n只猴子和多余的k个桃子
【输出】
输出只有一行,为所计算的m
【样例输入】
3 1
【样例输出】
25
展开
 我来答
wanglixin1001
推荐于2017-12-15 · TA获得超过4175个赞
知道大有可为答主
回答量:1758
采纳率:80%
帮助的人:1080万
展开全部
代码和分析如下:
#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=1;;i++)
{
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就可以了。
更多追问追答
追问
没学bool能用自定义函数吗??
追答
有些东西不需要等到学来才去了解,bool非常简单,就一个true一个false,了解了就知道了。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式