【练习题】 猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少
首先看到这道题我最先想到的是循环:设后一天的桃子数为an
于是前一天的桃子数为an-1
所以可得一个递推式an = an-1/2+ 1
逆推就可得:an =(an-1+ 1) * 2
所以这道题就可以解了
#include<stdio.h>
int main(){
int i = 0;
int N = 0;
scanf("%d",&N);
int an = 1;
for(i = 1; i < N; i++){
an = 2 * an + 2;
}
printf("%d",an);
}
如果只是锻炼我们的编程能力的话写到这就可以了,但是我们是神一样的程序员我们还要继续深挖:
如果逆推的话可得:an =(an-1+ 1) * 2
记得我们高三常做的一种题型是构造新数列:
设x
an + x = 2*(an-1 + x)并且这个式子等价于an = an-1/2 + 1
于是可得x = 2
所以可得一个新的等比数列设为bn = an +2
所以bn= 3 * 2n – 1
所以又可得代码:
#include<stdio.h>
int main()
{
int n = 0;
scanf("%d",&n);
int s = 3;
for(int i = 1; i < n; i++)
{
s *= 2;
}
printf("%d",s - 2);
}