程序中错误比较多:
1、是一个思维问题,猴子吃桃子会不会把一个桃子分两半来吃,你在程序中使用了实数,而不是整数,应该判断是不是能够被2整除;
2、i使用实数,也就是浮点数,而输出的时候使用的是%d的格式,所以,输出为0,可以改变格式为%f,或者将i转变成整数(printf("%d\n",(int)i);)
3、在外循环内部,改变了循环控制变量的值,也就是i的值,第一个循环下来,i的值就成了0了,所以不可能再循环,即使再循环,结果也不是要判断的i值,而是经过多次运算后的结果:1,你可以引入另外一个变量来做内循环和进行判断。
void main()
{
int j,k;
int i;
for(i=10000;i>1;i--)
{
k=i;
for(j=1;j<=10;j++)
{
if(k!=(k/2)*2) break;
k=k/2-1;
// printf("%d\n",k);
}
if(k==1) break;
}
printf("%d\n",i);
/* int i,j;
j=1;
for(i=0;i<10;i++)
j=(j+1)*2;
printf("%d\n",j);*/
}
1 4 10 22 46 94 190 382 766 1534
【程序21】
题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个
第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下
的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
1.程序分析:采取逆向思维的方法,从后往前推断。
2.程序源代码:
main()
{
int day,x1,x2;
day=9;
x2=1;
while(day>0)
{x1=(x2+1)*2;/*第一天的桃子数是第2天桃子数加1后的2倍*/
x2=x1;
day--;
}
printf("the total is %d\n",x1);
}
推呀:第九天吃完只剩一个了,那么就是(1+1)X2=4个
第八天:10个
第七天:22个
第六天:46个
第五天:94个
第四天:190个
第三天:382个
第二天:766个
第一天总共有:(766+1)X2=1534个
所以共摘了1534个桃子!!
int tian=9;//实际吃的天数
int yi=1;//最后所剩的桃子
while(tian>0)
{
yi=(yi+1)*2;//每天吃一半加一个,反过来就是加一乘2,所得赋值给yi,yi=4,就刷新了yi变量,等天数减到没得减,经过9次就是yi=1534,然后输出。
tian--;
}
printf("%d",yi);
天数n与剩下的桃子f之间的关系是:f(n)=f(n-1)/2-1
倒推的话是:f(10)=1; f(n-1)=(f(n)+1)*2
#include
void main()
{
int i;
int p[10];
p[10]=1;
for(i=9;i>0;i--)
{
p[i]=(p[i+1]+1)*2;
printf("day: %d; peaches: %d\n",i,p[i]);
}
}