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

2024-11-28 19:33:08
推荐回答(5个)
回答(1):

正确的答案是3121。
手工验算一下吧,又不难的!

#include

//判断能否被合理的分配
int divide(int n,int m)
{
if(n/5==0 || n%5!=1)
{//不足5个或不能分5份多1个,分配失败
return 0;
}
if(m==1)
{//分到最后一个猴子,说明能分配成功
return 1;
}
return divide(n-n/5-1,m-1);
}

main()
{
int n;//桃子数量

for(n=1;;n++)
{
if(divide(n,5))
{//判断能否被合理的分配
printf("%d\n",n);
break;
}
}
}

回答(2):

#include

int MinNum()
{
int i,j,num;
for(i=6;;i+=5)/*对所有能分成5份还余1的整数进行探试*/
{
num=i;
for(j=0;j<5;j++)/*5个猴子重复同一样的分桃过程*/
{
if(num/5==0||num%5!=1) break;/*如果剩余的桃子分不成5份或者分成5份后不会正好多余1个桃子,则说明分桃过程进行不下去了,结束分桃*/
num=num-num/5-1;/*如果分桃过程能进行下去,拿走一份,扔掉1个,下一个猴子继续分桃*/
}
if(j>=5) return i;/*如果上面的循环顺利结束,说明分桃顺利结束,找到了符合条件的最小桃子数,返回*/
}
}

main()
{
printf("最少桃子数为:%d\n",MinNum());
}

/*还有一种逆向求解的方法,探试的次数要少一点*/
#include

int MinNum()
{
int i,j,num;
for(i=6;;i+=5)
{
num=i;
for(j=4;j>0;j--)
{
if(num%4) break;
num=num+num/4+1;
}
if(j<=0) return num;
}
}

main()
{
printf("最少桃子数为:%d\n",MinNum());
}

回答(3):

这个太简单了;
把握一个想法: 总共分了N次分完的;
用个for循环:
for(int i=1;i<=N;i++)
然后就是每次都分上一次减1的1/5;
设最后一次是j;
则依次可以计算最开始的表达式;
即得。

回答(4):

main()
{int i,m,j,k,count;
for(i=4;i<10000;i+=4)
{ count=0;
m=i;
for(k=0;k<5;k++)
{
j=i/4*5+1;
i=j;
if(j%4==0)
count++;
else
break;
}
i=m;
if(count==4)
{printf("%d\n",j);
break;}
}
}

回答(5):

#include
using namespace std;
int main()
{int x=1,temp;
abc:{temp=x;
for(int i=5;i>0;i--)
{if(temp*5%4!=0){x++;goto abc;}
temp=temp*5/4+1;
}}
cout<return 1;
}