【題解】猴子喫桃

題目描述
猴子喫桃問題。猴子第一天摘下若干個桃子,當即吃了一半,還不過癮,又多吃了一個。 第二天早上又將剩下的桃子喫掉一半,又多喫一個。以後每天早上都吃了前一天剩下的一半零一個。 到第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~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章