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

猴子分桃c语言循环

发布时间: 2023-01-11 21:16:50

c语言,猴子吃桃子代码求注释

哥们好,我来解释解释哈
这个程序是倒着分析的:首先说的是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]就是所谓的总数目啦,
懂了吧,朋友?还没懂的话
就再继续探讨探讨哈
欢迎

② 亲猴子分桃问题的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

③ 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; }
}}

④ c语言:五猴分桃问题

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

⑤ 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只猴子什么的。**/

⑥ 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);
}
}
}
}