当前位置:首页 » 编程语言 » c语言猴子分桃问题
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言猴子分桃问题

发布时间: 2022-02-23 07:05:05

1. 亲猴子分桃问题的c语言编程拜求!详加注释!谢谢!

#include <stdio.h>
int is_over(int total,int t){ if(t==0) return 1;//当t变为了0,说明前面t次分桃均成功,则返回1 total-=1;//多余的桃子仍向海里 if(total%5!=0)//剩下桃子不能平均分成5份 return 0; if(total%5==0)//剩下桃子可以平均分成5份 return is_over(total-1-((total-1)/5),t-1); /*采用递归调用的方法,如果第一只猴子可以分到桃,则参数变为剩下的桃子和剩下的猴子,按照同样的方法进行分桃*/}/*用来判断总共total个桃子,t只猴子,按照题目所述的方式进行分桃,如果能够分成功,则返回1,如果不能分成功,则返回0 */
int main(){ int peach=1;//peach为桃子的总数量,并对桃子总数设定初值 do{ if(is_over(peach,5)){//当循环到达题目要求的正解时,if括号内会返回1,此时输出桃子的总数,并break语句跳出循环 printf("%d",peach); break; } else peach++; }while(1);//无限循环,peach从小到大逐渐增加,只有当得到正确的解答时,循环才会跳出}//最终答案为 3121

2. C语言编程题,关于猴子分桃问题

高质量不允许参考补充内容,这种打回的管理员需要回炉培训。

3. 猴子分桃问题,c语言,急~~~

答案是:至少剩8188,原来至少84371
/*猴子分桃改版*/
#include <stdio.h>

int main()
{
int previous (int current, int share, int remaining); /*定义分桃函数,current分完剩下数值,share份数,remaining被吃的余数,返回值为分前数目*/
int monkeyNum1=3, monkeyNum2=5; /*两组猴子数*/
int peachNum, peachNumr; /*桃子的总数和最后剩下的数目*/
int i,j; /*中间变量*/
for (i=1;i<10000;i++)
{
peachNum=i;
for(j=1;j<=monkeyNum2;j++)
{
peachNum=previous(peachNum, monkeyNum2, 1);
if(peachNum==0)
break;
}
if(peachNum==0)
continue;
for(j=1;j<=monkeyNum1;j++)
{
peachNum=previous(peachNum, monkeyNum1, 2);
if(peachNum==0)
break;
}
if(peachNum==0)
continue;
else
break;
}
peachNumr=i;
printf("At last remaining: %d\nNumber of all the peaches: %d\n",peachNumr,peachNum);
return 0;
}

int previous (int current, int share, int remaining)
{
int previousNum;
previousNum=current*share/(share-1)+remaining;
if(previousNum%share!=remaining)
return 0;
return previousNum;
}

4. C语言猴子分桃问题

#include <stdio.h>
void main(){
int i,s,n,k,num;//定义s为最初桃子的数量;num为最初桃子数减去k
scanf("%d%d",&n,&k);
for(num=n;num<=65535;num+=n)//因为可以被分成n份,num一定是n的倍数。
{ s=num+k;
for(i=1;i<=n;i++)//i用来控制n次循环,即分n次
if(s%n==k)//判断桃子能否被分n份并余下一个,成立就开始往下分,
s=(s-k)*(n-1)/n;
else
break;//不成立就直接跳出,不用执行后面的循环,即分不下去了
if(i==n+1)//注意:n次循环之后,i值为n+1。既然已经分了n次,那么num就找到了。
{
s=num+k;
printf("海滩上原来最少有%d个桃子\n",s);
break; }
}}

5. C语言数据结构之猴子分桃问题。

由文件input.txt 给出输入数据。第1 行中有3 个正整数n,k 和m,分别表示有n 只猴
子,每次最多取k个桃到筐中,每只猴子最终都分到m个桃子。
«结果输出:
将分桃过程中每只猴子离开队列的次序依次输出到文件output.txt。
输入文件示例 输出文件示例
input.txt output.txt
5 3 4 1 3 5 2
代码

#include"stdio.h"
#include"malloc.h"

void main()
{
int n,k,m;
int i,j;
int sub=0,p=0,flag=0;
int *queue;
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
scanf("%d %d %d",&n,&k,&m);
queue=(int *)malloc(n*sizeof(int));
for(i=0;i<n;i++)
queue[i]=0;
/*sub是用来存放多余的桃子。flag是用来控制循环用的。*/
while(flag<n)
{
for(j=0;j<n;j++)
{
if(queue[j]>=m) /*这只猴子已经领满m个桃子。*/
continue;
else if((queue[j]+p%k+1<m)&&(sub==0))
/*这只猴子还要继续领取他的桃子。*/
{
queue[j]=queue[j]+p%k+1;
p++;
}
else if((sub==0)&&(queue[j]+p%k+1>=m))
/*这只猴子刚领满m个桃子。*/
{
sub=queue[j]+(p%k)+1-m;
queue[j]=m;
p++;
flag++;
printf("%d ",j+1);
}
else if((sub+queue[j]<m)&&(sub!=0))
/*这只猴子还要继续领取他的桃子。*/
{
queue[j]=queue[j]+sub;
sub=0;
}
else if((queue[j]+sub>=m)&&(sub!=0))
/*这只猴子刚领满m个桃子。*/
{
sub=sub+queue[j]-m;
queue[j]=m;
flag++;
printf("%d ",j+1);
}
}
}
}

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

代码和分析如下:
#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就可以了。

7. c语言:五猴分桃问题

4/5是整型运算,会导致结果为0
于是后续a一直是0
无法退出循环

8. c语言:猴子分桃

呵呵,最近怎么一直看到猴子分桃。答案是620~

#include <iostream>

using namespace std;

float superMonkey(int n,int n2)
/**参数说明:n是几只猴子。n2是最后最迟醒来的猴子拥有的桃数,比如在你的题目最迟醒来的猴子最少最少都要有6个桃子,才能分成五份,再吃掉剩下的一个。**/
{
if (n==1) return n2;
float x;
x = (5 * (superMonkey(n-1,n2)+1))/4;
return x;

}

int main(int argc, char *argv[])
{
for(int i=6; i<=300;i++)
{
cout<<superMonkey(5,i)<<"\n";//5只猴子,为了找出原先最少必须有几个,用循环求答案直到找到一个整数。
}
cin.get();
}

/**接下来出现的一堆数字就是一开始的桃数。不能有小数点的,所以要找的是第一个出现的整数。我放300次循环因为我稍微试过了,620是原先必须有的最少桃数(第一个出现的整数就是620啊)。你可以稍微改改,放个检测整数的函数,就不用看到一堆数字了。还可以该题目成10只猴子什么的。**/

9. 用C语言编一程序 猴子分桃的问题

摘的数量最少是什么样的情况?我想应该满足:
1,第5只猴子有桃子吃;
2,第5只猴子在醒后吃桃子之前把桃子平均分成了5份,而且还多了一个桃子(隐含意义是第5只猴子吃了2个桃子,剩下4个桃子,这样才满足摘的数量最少);
那么我们就知道了,最后一个猴子(将猴子数量扩展为未知,猴子数为n)醒后还有n+1个桃子;
第n-1个猴子醒后还有n*(n+1)+1个桃子;
第n-2个猴子醒后还有n*(n*(n+1)+1)+1;
以此类推,可由递归算出桃子总数

10. C编程:猴子分桃问题

#include<iostream.h>
int main()
{
int m,n,k,r;
cout<<"输入n和k的值"<<endl;
cin>>n>>k;
for(m=n+n*k;m>=0;m++)

{
while(m%n!=0)
{
m=m-k;
if(m%n==0)
{
cout<<m<<endl;
goto n;}
}}
n:cout<<"最少有"<<m<<"个桃子"<<endl;
system("PAUSE");
} C语言不会,C++写的