詳解C語言解決經(jīng)典問題之兔子產(chǎn)子
1. 問題描述
有一對兔子,從出生后的第 3 個(gè)月起每個(gè)月都生一對兔子。
小兔子長到第 3 個(gè)月后每個(gè)月又生一對兔子,假設(shè)所有的兔子都不死,問 30 個(gè)月內(nèi)每個(gè)月的兔子總數(shù)為多少?
2. 題目分析
這是一個(gè)有趣的古典數(shù)學(xué)問題,我們畫一張表來找一下兔子數(shù)的規(guī)律吧
Tip:不滿 1 個(gè)月的兔子為小兔子,滿 1 個(gè)月不滿 2 個(gè)月的為中兔子,滿3個(gè)月以上的為老兔子。
可以看出,每個(gè)月的兔子總數(shù)依次為 1,1,2,3,5,8,13…這就是 Fibonacci數(shù)列。
總結(jié)數(shù)列規(guī)律:即從前兩個(gè)月的兔子數(shù)可以推出第 3 個(gè)月的兔子數(shù)。
3. 算法設(shè)計(jì)
該題目是典型的迭代循環(huán),即是一個(gè)不斷用新值取代變量的舊值,然后由變量舊值遞推出變量新值的過程。
這種迭代與如下因素有關(guān):初值、迭代公式、迭代次數(shù)。經(jīng)過問題分析,算法可以描述為:
用C語言來描述選代公式即為fib=fibl+fib2。
其中 fib 為當(dāng)前新求出的兔子數(shù)。
fib1 為前一個(gè)月的兔子數(shù)。
fib2 中存放的是前兩個(gè)月的兔子數(shù),然后為下一次選代做準(zhǔn)備。
進(jìn)行如下的賦值fib2=fib1,fib1=fib,要注意賦值的次序,選代次數(shù)由循環(huán)變量控制,表示所求的月數(shù)。
4. 代碼實(shí)現(xiàn)
完整代碼
#include <stdio.h> int main() { long fib1 = 1; long fib2 = 1; long fib = 0; int i = 0; printf("%12d%12d", fib1, fib2); for (i = 3; i <= 30; i++) { fib = fib1 + fib2; printf("%12d", fib); if (i % 4 == 0) { printf("\n"); } fib2 = fib1; fib1 = fib; } printf("\n"); return 0; }
運(yùn)行結(jié)果
代碼解釋
5. 算法升級
這個(gè)程序雖然是正確的,但可以進(jìn)行改進(jìn)。
目前用 3 個(gè)變量來求下一個(gè)月的兔子數(shù),其實(shí)可以在循環(huán)體中一次求出下兩個(gè)月的兔子數(shù),就可以只用兩個(gè)變量來實(shí)現(xiàn)。
這里將fib1+fib2 的結(jié)果不放在 fib 中,而是放在 fib1 中,此時(shí) fib1 不再代表前一個(gè)月的兔子數(shù),而是代表最新一個(gè)月的免子數(shù)。
再執(zhí)行fib2=fib1+fib2,由于此時(shí) fib1 中已經(jīng)是第 3 個(gè)月的兔子數(shù)了,因此 fib2 中就是第 4 個(gè)月的兔子數(shù)了。
可以看出,此時(shí) fib1 和 fib2 均為最近兩個(gè)月的兔子數(shù),循環(huán)可以推出下兩個(gè)月的兔子數(shù)。
改進(jìn)程序如下
#include <stdio.h> int main() { long fib1 = 1, fib2 = 1; int i = 0; for (i = 1; i <= 15; i++) { printf("%12d%12d", fib1, fib2); if (i % 2 == 0) { printf("\n"); } fib1 = fib1 + fib2; fib2 = fib1 + fib2; } return 0; }
代碼解釋
到此這篇關(guān)于詳解C語言解決經(jīng)典問題之兔子產(chǎn)子的文章就介紹到這了,更多相關(guān)C語言兔子產(chǎn)子問題內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于OpenCV讀取攝像頭實(shí)現(xiàn)單個(gè)人臉驗(yàn)證MFC程序
這篇文章主要為大家詳細(xì)介紹了基于OpenCV讀取攝像頭實(shí)現(xiàn)單個(gè)人臉驗(yàn)證MFC程序,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-08-08C語言實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)迷宮實(shí)驗(yàn)
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)迷宮實(shí)驗(yàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-03-03C++?STL之string的模擬實(shí)現(xiàn)實(shí)例代碼
C++中有命名空間的存在,我們只需把我們的代碼封到自定義的命名空間即可,下面這篇文章主要給大家介紹了關(guān)于C++?STL之string的模擬實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下2023-01-01C語言實(shí)現(xiàn)動態(tài)順序表的實(shí)現(xiàn)代碼
這篇文章主要介紹了C語言實(shí)現(xiàn)動態(tài)順序表的實(shí)現(xiàn)代碼的相關(guān)資料,動態(tài)順序表在內(nèi)存中開辟一塊空間,可以隨我們數(shù)據(jù)數(shù)量的增多來擴(kuò)容,需要的朋友可以參考下2017-08-08