C語言解決兔子產子問題程式碼及解析
問題描述
有一對兔子,從出生後的第3個月起每個月都生一對兔子。小兔子長到第3個月後每個月又生一對兔子,假設所有的兔子都不死,問30個月內每個月的兔子總數為多少?
問題分析
兔子數的規律,如下表所示:
月數 | 小兔子對數 | 中兔子對數 | 老兔子對數 | 兔子總數 |
---|---|---|---|---|
1 | 1 | 0 | 0 | 1 |
2 | 0 | 1 | 0 | 1 |
3 | 1 | 0 | 1 | 2 |
4 | 1 | 1 | 1 | 3 |
5 | 2 | 1 | 2 | 5 |
6 | 3 | 2 | 3 | 8 |
7 | 5 | 3 | 5 | 13 |
提示:不滿1個月的兔子為小兔子,滿1個月不滿2個月的為中兔子,滿3個月以上的為老兔子。
可以看出,每個月的兔子總數依次為1, 1, 2, 3, 5, 8, 13…這就是Fibonacci數列。總結數列規律即從前兩個月的兔子數可以推出第3個月的兔子數。
演算法設計
該題是典型的迭代迴圈,即是一個不斷用新值取代變數的舊值,然後由變數舊值遞推出變數新值的過程。這種迭代與如下因素有關:初值、迭代公式、迭代次數。經過問題分析,演算法可以描述為:
用C語言來描述迭代公式即為:
fib = fib1 + fib2
其中 fib 為當前新求出的兔子數,fib1為前一個月的兔子數,fib2 中存放的是前兩個月的兔子數,然後為下一次迭代做準備,進行如下的賦值 fib2=fib1,fibl=fib,要注意賦值的次序,迭代次數由迴圈變數控制,表示所求的月數。
下面是完整的程式碼:
#include <stdio.h>
int main()
{
long fib1=1, fib2=1, fib;
int i;
printf("%12ld%12ld", fib1, fib2); /*輸出第一個月和第二個月的兔子數*/
for(i=3; i<=30; i++)
{
fib = fib1 + fib2; /*迭代求出當前月份的兔子數*/
printf("%12ld", fib); /*輸出當前月份兔子數*/
if(i % 4 == 0)
printf("\n"); /*每行輸出4個*/
fib2 = fib1; /*為下一次迭代作準備,求出新的fib2*/
fib1 = fib; /*求出新的fib1*/
}
printf("\n");
return 0;
}
執行結果:
1 1 2 3
5 8 13 21
34 55 89 144
233 377 610 987
1597 2584 4181 6765
10946 17711 28657 46368
75025 121393 196418 317811
514229 832040