题目33:五猴分桃问题是:五只猴子合作摘了很多桃子,感到累了,决定先去睡觉,醒后再分。不知过了多久,第一只猴子醒了,看见其它猴子都没有醒,就把所有桃子分为五堆,发现多一个,就吃了一个,拿走一堆,把剩下的又堆在一起走了。第2只猴子醒来,以为自己是第一个,也是把桃子分为五堆,也是多一个,就吃了一个,拿走一堆,剩下的又堆在一起走了。第3,4,5只猴子都是这样。现在问总共摘了多少桃子,每只猴子连吃再拿是多少?最后还剩多少?据说,这个问题是著名物理学家狄拉克提出来的,美籍中国著名物理学家李政道访问中国科技大学少年班时用做考题,少年班的同学都没有当时解答出来。我们是计算机系的同学,可以编写一个很简单的程序轻松地解此问题。当然程序解答后也可以考虑一下如何更简单巧妙些解此问题。(可参阅:谈祥柏著,乐在其中的数学,科学出版社,2005年8月,总序ⅴ-ⅶ页。)
提示:可参考以下程序段: //五猴分桃问题
void main() //从1至10000枚举
{int i,x,c; //在上范围内找到三个解:3121, 6246, 9371
for(i=1;i<10000;i++){x=i;c=0;while((x-1)%5 == 0){x=x-1-(x-1)/5;c++;}
if(c==5) printf("i=%d,x=%d\n",i,x);} getchar();}
#include <stdio.h>
int ok(int n)
{
int i;
for(i=0;i<5;i++)
{
if(n%5!=1)return 0;
n=(n-1)/5*4;
}
return 1;
}
int main()
{int n,k,l,a[3];
for(n=6;n<10000;n++)
{
if(ok(n))
{
printf("%d\n",n);
l++;
a[l]=n;
}
}
for(l=0;l<3;l++)
{
printf("若猴子拿到和吃掉的桃总数为:");
printf("%d\n",a[l]);
printf("则每只猴子拿到和吃掉的桃数\n");
printf("第一只猴子拿到和吃掉的桃数:");
printf("%d\n",a[l]=(a[l]-1)/5+1);
printf("第二只猴子拿到和吃掉的桃数:");
printf("%d\n",a[l]=(4*a[l]-1)/5+1);
printf("第三只猴子拿到和吃掉的桃数:");
printf("%d\n",a[l]=(4*a[l]-1)/5+1);
printf("第四只猴子拿到和吃掉的桃数:");
printf("%d\n",a[l]=(4*a[l]-1)/5+1);
printf("第五只猴子拿到和吃掉的桃数:");
printf("%d\n",a[l]=(4*a[l]-1)/5+1);
}
return 0;
}
猴子摘桃问题?我写的c语言程序哪里出错了。
} \/\/你的程序没控制好变量
C语言转化方程。 猴子摘桃
这道题我的c语言书上有。给你看一下:假设第一天有a1个桃,第二天有a2个,……,第九天有a9个,第10天有a10个。在这里面只有a10=1是知道的,我们要计算a1,而我们可以看出,a1~a10存在着简单的联系:a9=2(a10 1)a8=2(a9 1)a7=2(a8 1)…a1=2(a2 1)由此我们可以看出这是一个递推关系。
C语言作业:用递归法怎么做猴子摘桃?知道的大哥大姐帮帮忙!
猴子摘桃问题 猴子第一天摘下N个桃子,当时就吃了一半,还不过瘾,就又多吃了一个。第二天又将剩下的桃子吃掉一半,又多吃了一个。以后每天都吃前一天剩下的一半零一个。到第10天在想吃的时候就剩一个桃子了,问第一天共摘下来多少个桃子?include <stdio.h> int getPeachNumber (n) { i...
猴子摘桃!C语言,老是输出自己的值,新人求教
include<stdio.h>int q(int a){ int i; int b = 1; int c; for (i=1;i<=a-1;i++) { c = 2 * (b + 1); b = c; } return c;}int main(void){int a; while(~scanf("%d",&a)) {if (a!=1) { printf("%d\\n",q(a))...