1. 程式人生 > >18.12.09-C語言練習:兔子繁衍問題 / Fibonacci 數列

18.12.09-C語言練習:兔子繁衍問題 / Fibonacci 數列

題目:

問題解析:

這是典型的/Fibonacci 數列問題。具體這裡不贅述。

問題中不論是初始的第1對兔子還是以後出生的小兔子都是從第3個月齡起每個月各生一對兔子。

設n1,n2,n3分別是每個月1個月月齡,2個月月齡,大於等於3個月月齡的兔子數量。則下個月這三個型別月齡兔子數量分別是 n3, n1, n3+n2。

即:下個月1個月月齡兔子數量是上個月大於等於3個月月齡兔子的數量,2個月月齡兔子數量是上個月1個月月齡兔子數量,大於等於3個月月齡兔子數量是上個月大於等於3個月月齡兔子數量加上上個月2個月月齡兔子數量。

程式:

 1 #include <stdio.h>
 2
int main(void) { 3 /*n1, n2, n3 分別是有1個月月齡,2個月月齡,3個月月齡的兔子數量*/ 4 int n1 = 1, n2 = 0, n3 = 0; 5 /*total 是兔子總數量*/ 6 int total = 0; 7 /* i 是月份, num是輸入變數, t是中間變數 */ 8 int i=1, num, t; 9 printf("請輸入數量:"); 10 scanf("%d", &num); 11 while(1){ 12 total = n1 + n2 + n3;
13 if(total >= num) break; 14 /*求下個月兔子數量*/ 15 i += 1; 16 /*下面四行語句注意順序不能混亂*/ 17 t = n1; 18 n1 = n3 + n2; 19 n3 += n2; 20 n2 = t; 21 } 22 printf("所需月數:%d\n", i); 23 return 0; 24 }

程式執行結果:

 

問題表述中可能不嚴謹的地方:

1. 第一對兔“第3個月起”, 新生兔子“第3個月後”。不夠嚴謹,因為月是一個時間段,應統一理解為“三個月後”。上述程式也是這麼理解的。

2. “第幾個月時兔子總數才可以達到n對?”。似乎有歧義:剛好達到n對還是大於等於n對。上述統一理解為“大於等於n對”。