五猴分桃c语言
‘壹’ 猴子分桃问题,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;
}
‘贰’ 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语言----5只猴子分桃
LZ你不妨倒着来,题目要求最少,那就假设最后一个猴子(第五只)扔了一个后就没了,那么第四只猴子扔了后应该有六个,同理,第三只扔了后有(6+1)*5=35个,所以就有了如下的程序:
#include<stdio.h>
main()
{
inti,s=0;
for(i=1;i<=5;i++)
{
s=(s+1)*5;
}
printf("%d ",s);
}
‘肆’ C语言程序设计——猴子分桃
#include <stdlib.h>
#include<stdio.h>
#define N 10
#define M 20
struct monkey
{
int id;
int tao;
};
struct queue
{
struct monkey content[N];
struct monkey* head;
struct monkey* tail;
int length;
};
int queue_init(struct queue** q)
{
(*q) = (struct queue*)malloc(sizeof(struct queue));
(*q)->head = &(*q)->content[0];
(*q)->tail = &(*q)->content[0];
(*q)->length = 0;
return 0;
}
int queue_in(struct queue* q,struct monkey in)
{
if(q->length == 0)
{
*(q->tail) = in;
q->length++;
}
else
{
q->tail++;
*(q->tail) = in;
q->length++;
}
return 0;
}
int queue_out(struct queue* q, struct monkey* out)
{
int i = 0;
*(out) = *(q->head);
for(;i < q->length-1;i++)
q->content[i] = q->content[i+1];
q->tail--;
q->length--;
return 0;
}
//队首到队尾
int queue_a(struct queue* q)
{
struct monkey temp;
queue_out(q, &temp);
queue_in(q,temp);
return 0;
}
int main()
{
struct monkey data[N];
struct queue* q = NULL;
struct monkey temp;
int i;
int kuang = 0;
for(i=0;i<N;i++)
{
data[i].id = i+1;
data[i].tao = 0;
}
queue_init(&q);
for(i=0;i<N;i++)
queue_in(q, data[i]);
for(i=0;i<N;i++)
{
printf("%d\t%d\n",q->content[i].id,q->content[i].tao);
}
printf("leng=%d\n",q->length);
printf("head %d\t tail %d\n",q->head->id,q->tail->id);
i = 0;
while(q->length != 0)
{
if(kuang == 0)
{
i++;
kuang += i;
}
//队首猴取桃
if(q->head->tao + kuang < M)
{
q->head->tao += kuang;
kuang = 0;
queue_a(q);
}
else
{
kuang -= M - q->head->tao;
q->head->tao += M - q->head->tao;
queue_out(q, &temp);
printf("%d\t%d\n",temp.id,temp.tao);
}
}
return 0;
}
‘伍’ c语言:五猴分桃问题
4/5是整型运算,会导致结果为0
于是后续a一直是0
无法退出循环
‘陆’ c语言,解题思路,最好附程序注释……五个猴子分桃,答案是3121的那个
#include<stdio.h>
//判断能否被合理的分配
intdivide(intn,intm)
{
if(n/5==0||n%5!=1)
{//不足5个或不能分5份多1个,分配失败
return0;
}
if(m==1)
{//分到最后一个猴子,说明能分配成功
return1;
}
returndivide(n-n/5-1,m-1);
}
main()
{
intn;//桃子数量
for(n=1;;n++)
{
if(divide(n,5))
{//判断能否被合理的分配
printf("%d ",n);
break;
}
}
}
‘柒’ c语言:五猴分桃问题,我自己写了个程序,不知道错在哪求指点,谢谢
你的 for(n=10000;n>1;n--)
n=10000。已经赋值。而五猴分桃中n是一不确定值! 桃子不一定小于10000个
‘捌’ C语言 5猴分桃求思路
假如原来有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循环结束
‘玖’ 用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;
以此类推,可由递归算出桃子总数
‘拾’ 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]就是所谓的总数目啦,
懂了吧,朋友?还没懂的话
就再继续探讨探讨哈
欢迎