題目描述
猴子吃桃問題。猴子第一天摘下若干個桃子,當即吃了一半,還不過癮,又多吃了一個。 第二天早上又將剩下的桃子吃掉一半,又多吃一個。以后每天早上都吃了前一天剩下的一半零一個。 到第N天早上想再吃時,見只剩下一個桃子了。求第一天共摘多少桃子。
輸入
N
輸出
桃子總數
樣例輸入
10
樣例輸出
1534
問題分析:
1,利用遞歸思想解決:
1 #include<stdio.h> 2 int eat(int N); 3 int main() 4 { 5 int N,num; 6 scanf("%d",&N); 7 printf("%d",eat(N)); 8 return 0; 9 } 10 int eat(int N) 11 { 12 if(N==1) return 1; 13 while(N!=1) 14 { 15 return (eat(N-1)+1)*2; 16 N-1; 17 } 18 }
將N理解為天數,從前往后思考,每一天都是前一天+1后的兩倍,且第一天只有一個桃子且沒有吃,所以遞歸N-1次;
2,用for循環解
1 include <stdio.h> 2 void main() 3 {int n,s=1,i;//n為天數,s為最后留下的 4 scanf(“%d”,&n); 5 for(i=0;i<n-1;i++) 6 s=(s+1)*2; 7 printf(“%d”,s); 8 }
用python的話4行就搞定了
n=1 for day in range(1,10): n = (n+1)*2 print(n)
思路和遞歸的思想類似,也是反向思維,從第一天往后推,當天數少時遞歸和for循環效率應該差不多,但當天數很大時遞歸會出現錯誤,具體原因我還沒理解,我推測是C語言最大值溢出了。