猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。

2024-12-21 08:38:55
推荐回答(3个)
回答1:

这个程序要用逆推的方法,一个循环就够了:

#include 
#include

 main()

int n,i,s=1;
printf("Input days:\n");
scanf("%d",&n);
for(i=0;i s=2*(s+1);
printf("x=%d\n",s);
system("pause");
}

回答2:

设猴子第一天公摘了x个桃子。
则第一天吃了后,剩下的桃子=(x/2)-1 = (x/(2^1)) - ((2^1)-1)/(2^(1-1))
第二天吃了后,剩下的桃子数=((x/2)-1)/2) -1 =(x/4) - (1/2) - 1 =(x/(2^2)) - ((2^2)-1)/(2^(2-1));
所以,第n(n<9) 天吃了后,剩下的桃子数= (x/(2^n)) - ((2^n)-1)/(2^(n-1))
第10天早上发现只有一个了,即第九天吃了后,剩下的桃子只有一个了。即:
(x/(2^9) - ((2^9)-1)/(2^(9-1))=1,
x=(2^9)+2*(2^9-1)=(2^9)+(2^10)-2 =512+1024-2=1534;

回答3:

#include
void main()
{
int day=1,t,a=0;
for(t=1;a!=1;t++)
{
a=t;
day=0;
do
{
a=a/2-1;
day++;
}while(day<10);
if(a==1)
printf("t=%d\n",t);
}
}
其实,上面的程序不够严密:如a是一个奇数,程序照样可以运行;但是却与题目所述不符。所以最好改为如下(运行结果相同):

#include
void main()
{
int day=1,t,a=0;
for(t=1;a!=1;t++)
{
a=t;
day=0;
do
{ if(a%2)break;
a=a/2-1;
day++;
}while(day<10);
if(a==1&&day==10)
printf("t=%d\n",t);
else a=0;
}
}