題目描述
猴子喫桃問題。猴子第一天摘下若干個桃子,當即吃了一半,還不過癮,又多吃了一個。 第二天早上又將剩下的桃子喫掉一半,又多喫一個。以後每天早上都吃了前一天剩下的一半零一個。 到第N天早上想再喫時,見只剩下一個桃子了。求第一天共摘多少桃子。
輸入
N
輸出
桃子總數
樣例輸入
10
樣例輸出
1534
解題思路
我們首先要確定了計算方法以及控制變量
1.每天喫一半多一個,到最後剩一個。
- 所以我們計數變量count 開始應該初始化爲1;
- 喫桃速度通過計算可以獲得出來是count = (count + 1) * 2
2.因爲猴子到第N 天的時候,只剩下一個桃子了。
- 所以它實際喫桃子的天數其實是N - 1天
在確定了計算方法以及控制變量,就可以選擇使用哪種方法來完成操作了
下面提供了兩種方法,遞歸和for() 循環
方法一:遞歸
#include <stdio.h>
int funcion(int N, int count); //自定義函數來完成這個操作
int main(void){
int N, count = 1; //將計數變量count 定義成main()的局部變量
scanf("%d", &N); //接收用戶輸入的天數
printf("%d", funcion(N, count)); //傳入天數N 和計數變量count 給函數操作
return 0;
}
int funcion(int N, int count){
/*
* 假設第N 天只剩下一個桃子的話,其實猴子只吃了N - 1天。
*/
if(N == 1) return count;
count = (count + 1) * 2; //逆推猴子喫桃的規律
funcion(--N, count); //N-- 會陷入死循環,需提前將天數減小
//--N == N - 1;
}
或者我們可以換一種簡單的方法,直接通過for() 循環來完成該操作
方法二:for()循環
#include <stdio.h>
int main(void){
int N, count = 1; //將計數變量count 定義成main()的局部變量
scanf("%d", &N); //接收用戶輸入的天數
for(int i = 1; i < N; i++){ //從第一天開始,到第N - 1天結束
count = (count + 1) * 2; //逆推猴子喫桃的規律
}
printf("%d", count); //輸入桃子的數量
return 0;
}
創作不易,你的點贊是我最大的動力!!!
我們下次再見 end~