近日写一个关于猴子吃桃的数学题目,求出猴子第一天摘的桃子总数目。
原题为:猴子第1天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第2天早上又将剩下的桃子吃掉一半,又多吃了一个,以后每天早上都吃了前一天剩下的一半零一个,到第10天早上想再吃时,就只剩下一个桃子了。C语言编程求第1天共摘了多少个桃子。
分析问题:每一天吃的桃子为前1天剩下桃子的一半加1,第十天只剩下1只,反推之,前一天的桃子总数为当天(未吃)的桃子数加上1的2倍,如第9天桃子的总数为2*(1+1)=4,第8天的为2*(4+1)=10,第7天的为2*(10+1)=22......以此类推。
接下来是思考如何用编程来实现,我采取的是递归求解的方式进行编程,如下所示:
#include<stdio.h>
int num(int temp)
{
int count;
if(temp=10)
{
count=1;
}
else
{
count=(num(temp+1)+1)*2;//第temp天的桃子总数
}
return count;
}
int main()
{
int i;
i=num(1);//代入实参1,赋值给i,即i表示第一天的桃子总数
printf("第一天的桃子总数是%d个\n",i);
return 0;
}
但是调试的结果是错误的:
root@LAPTOP-LUU3AAQE:/mnt/d/C_Code# gcc c58.c -o main
root@LAPTOP-LUU3AAQE:/mnt/d/C_Code# ./main
第一天的桃子总数是1个
root@LAPTOP-LUU3AAQE:/mnt/d/C_Code#
为什么呢?原因出现在“=”,在C语言中一个“=”表示赋值,“==”才是等于,所以代码只能执行到前面的if语句,else是执行不到的。
改正后:
#include<stdio.h>
int num(int temp)
{
int count;//桃子总数
if(temp==10)//"=="才是等于
{
count=1;
}
else
{
count=(num(temp+1)+1)*2;
printf("第%d天桃子总数count=%d\n",temp,count);//调试用,可注释掉
printf("------\n");
}
return count;
}
int main()
{
int i;
i=num(1);
printf("第一天的桃子总数是%d个\n",i);
return 0;
}
root@LAPTOP-LUU3AAQE:/mnt/d/C_Code# gcc c58.c -o main
root@LAPTOP-LUU3AAQE:/mnt/d/C_Code# ./main
第9天桃子总数count=4
------
第8天桃子总数count=10
------
第7天桃子总数count=22
------
第6天桃子总数count=46
------
第5天桃子总数count=94
------
第4天桃子总数count=190
------
第3天桃子总数count=382
------
第2天桃子总数count=766
------
第1天桃子总数count=1534
------
第一天的桃子总数是1534个
root@LAPTOP-LUU3AAQE:/mnt/d/C_Code#
总结:千里之堤,溃于蚁穴,细节很重要,基础要牢固。