一、題目
問題描述 :
有一家生化所,一月份引入一對新生的小白鼠。這對小白鼠生長兩個月後,在第
三、第四、第五個月各繁殖一對新小白鼠,在第六個月停止繁殖,在第七個月則死亡。新生的小白鼠也如此繁殖。問在第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...