東華OJ 基礎 34繁殖問題

2021-10-18 15:35:30 字數 1705 閱讀 7093

一、題目

問題描述 :

有一家生化所,一月份引入一對新生的小白鼠。這對小白鼠生長兩個月後,在第

三、第四、第五個月各繁殖一對新小白鼠,在第六個月停止繁殖,在第七個月則死亡。新生的小白鼠也如此繁殖。問在第n個月時,活的小白鼠有多少對?

輸入說明 :

你的程式需要從標準輸入裝置(通常為鍵盤)中讀入多組測試資料。每組輸入資料由一行組成,其中只有乙個整數n(0 < n ≤ 50)。兩組輸入資料間無空行。

輸出說明 :

對於每組測試資料,你的程式需要向標準輸出裝置(通常為啟動該程式的文字終端)輸出一行,其中只有乙個整數,即第n個月時活的小白鼠有幾對,所有資料前後沒有多餘的空行,兩組資料之間也沒有多餘的空行。

輸入範例 :12

3456

7830輸出範例 :11

2357

1015

67066

二、思路及**

1、問題分析:

此題與fibonacci提出的乙個古典數學問題很相似(兔子繁殖問題:有一對小兔子,從出生後第3個月起每個月都生一對兔子。小兔子長到第3個月後每個月又生一對兔子。按此規律,假設沒有兔子死亡,第乙個月有一對剛出生的小兔子,問第n個月有多少對兔子?),該問題可分解為:第n個月的兔子總數f(n) =前乙個月的兔子總數 f(n-1) + 新生的兔子數f(n-2),即用斐波那契數列求解。

而本題新增條件:第六個月停止繁殖,第七個月死亡。這是本題的關鍵點。若沿用斐波那契的思路計算總數的話,不繁殖和死亡的數目不太好表示,可能會存在重複減的情況。因此,斐波那契的思路行不通。

2、解題方法:

思路一:用乙個一維陣列存放每個月新生和死亡的小白鼠數目。

即:第i個月新生的兔子數:born[i]=born[i-2]+born[i-3]+born[i-4];

第i個月死亡的兔子(出生置0):born[i-6]=0;

#include

int born[51]

;//計算1——n月出生和死亡(之前第六個月新出生數置0)的數量

void

borndie

(int n)

born[1]

=1;for

(int i=

3;i<=n;i++)if

(i-3

>0)

if(i-

4>0)

if(i-

6>0)

}}intmain()

prinf

("%d\n"

,sum);}

return0;

}

思路二:找規律

通過觀察每個月的小白鼠總數可以發現,從第7個月開始,amount[i]=amount[i-2]+amount[i-3]+amount[i-4];

#include

intmain()

;for

(int i=

7;i<=

50;i++

)int n;

while

(scanf

("%d"

,&n)

!=eof

)return0;

}

東華OJ基礎 34繁殖問題

34 繁殖問題 問題描述 有一家生化所,一月份引入一對新生的小白鼠。這對小白鼠生長兩個月後,在第 三 第四 第五個月各繁殖一對新小白鼠,在第六個月停止繁殖,在第七個月則死亡。新生的小白鼠也如此繁殖。問在第n個月時,活的小白鼠有多少對?輸入說明 你的程式需要從標準輸入裝置 通常為鍵盤 中讀入多組測試資...

東華oj 基礎題第32題

32 完數個數 問題描述 完數的定義 如果乙個大於1的正整數的所有真因子 不包括自己的那些因子 之和等於它的本身,則稱這個數是完數,比如6,28都是完數 6 1 2 3 28 1 2 4 7 14。本題的任務是判斷兩個正整數之間完數的個數。輸入說明 第一行是乙個正整數n,表示測試例項的個數,然後就是...

東華oj 基礎題第40題

40 分拆素數和 問題描述 把乙個偶數拆成兩個不同素數的和,有幾種拆法呢?說明 比如10,可以拆成3 7和5 5以及7 3,但是3 7與7 3相同,只算一種,5 5由於兩個素數相同,不計算在內。因此,10的拆法只有一種。輸入說明 首先輸入乙個t 不超過500 然後輸入t個正的偶數,其值不會超過100...