トピック:
サルは初日に桃を数個摘み、すぐに半分を食べ、空腹を満たす前にもう1個食べ、翌朝、残りの半分を食べて、また1個食べました。それからは毎朝、前日の残りを半分以上食べていました。10日目の朝また食べようと思ったら桃が1個だけ残ってました。初日にいくら拾ったんですか?
プログラム分析 (逆転の発想):
猿は初日に桃を拾った後、1日目から9日目までに元の桃の半分を食べ、その後もう1個食べ、10日目には桃を1個残したので、9日目に残った桃は残りの桃に 1 を加えて 2 を掛け、9 回サイクルして初日に桃を収穫します。
コード:
#include <stdio.h>
int main()
{
int i=9,sum=1;//i表示天数,sum表示桃子数,第十天桃子剩余一个
for(i=9;i>0;i--)
{
sum=(sum+1)*2;
}
printf("猴子一共采摘了%d个桃子",sum);
return 0;
}
コード効果:
もちろん、前日の桃の数を y1 、翌日の桃の数を y2 とする逆の考え方もあります。9 日目からは 9 は奇数なので、y1 の最終値は桃の合計数になります。
コード:
#include <stdio.h>
int main(){
int day=9,x1=0,x2=1;
while(day>0) {
x1=(x2+1)*2;//第二天的桃子数是前一天桃子数加1后的2倍
x2=x1;
day--;
}
printf("猴子采摘桃子的总数是%d\n",x1);
return 0;
}
コード効果: