1. 程式人生 > >C語言解決兔子產子問題程式碼及解析

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

​C語言解決兔子產子問題程式碼及解析