簡單計算題 雞兔同籠

2021-07-11 16:28:00 字數 1871 閱讀 2735

我國古代著名趣題之一。

《孫子算經》中這樣描述:「今有雞兔同籠,上有三十五頭,下有九十四足,問雞兔各幾何?」

先來正確解的完整**:

#include

int

main()

一般對於這種簡單的問題,像博主這樣的渣渣新手們通常想到的都是暴力破解:

雙重迴圈便利所有可能組合,再進行判斷篩選,**如下:

for(int

t(1);t

<=head;++t)

}
簡單暴力,不用想!就是這麼任性!

雖然博主是剛剛入門的渣渣但本著為了世界和平(認真臉)也要提醒那些和博主一樣的渣渣新手們,這種方法是非常不值得提倡的!不值得提倡!不值得提倡!

重要的事情說三遍 哈哈

且不說這樣的**會暴露自己的水平,複雜度n*n這個樣子足以讓你在資料量大的時候等的崩潰,搞不好還會溢位呢

其實稍加思考,聰明一點的渣渣會想出這樣的**:

for(int

j(0);j

<=head;++j)

這個**時間複雜度為n,相比上乙個**而言,速度不知道提高了多少!

看吧,動腦子的作用就是這麼神奇,稍加思考複雜度就從n*n 縮小到n,在你的聰明才智下心愛的電腦少算這麼多次呢

你以為算到這裡就結束了嗎?少年,你真的too young too ******!!!

當初博主就是拿著這樣乙個自以為聰明的**去找大神表揚,然後,然後就被現場碾壓了

如何讓複雜度直接變為1?

你沒有聽錯,就是1!

對於剛剛了解基礎語法的新手,在學會for之後基本上稍微多一點的資料就都往迴圈上扯

讓我們來換一種思路

把它當成數學題來算:兩個未知量,兩個方程,讓我們來解方程

設未知量j(雞),t(兔). 有j + t = head; 2j + 4t = foot; 解方程之後有 t = (foot  -  2head)  / 2;

這不就皆大歡喜,一次計算就得出了結果!

具體**如下:

rabbit=(foot-head*

2)/2;

//

我們定義rabbit為int型,所以在上一步計算中,當頭腳數量不匹配時有可能出現數值擷取現象

//

所以在之後的需要判斷計算之後兔子和小雞的腳數與輸入的總腳數是否相等,如果不相等則無解,直接結束

if(rabbit*

4+(head-rabbit)*

2!=foot)

return

-1;

else

std::cout

<<

"chook

has:"

<

<<

"\t"

<<

"rabbit

has:"

<

通過這一道題,博主真的收穫很多:

1、拿到問題不要直接就做,分析思考想明白之後再開始敲**;

2、同一問題多和別人交流,說不定別人的方法會讓你眼前一亮;

3、程式設計的時候不要只侷限與語言的特性,要將問題實際化,多換幾種思路,注重自己思考的過程並盡力將之實現在**上(不會程式設計的時候我遇到這個問題大腦是如何思考的,如何得出答案的);

4、要學會考慮時間複雜度,盡可能讓**簡單,高效;

4、多看到書、多程式設計、還是自己太太太太渣

*ps:歡迎各位大神不嫌棄渣進行指正批評,也歡迎各位比我還渣的同學提問,我們一起成長

64 雞兔同籠

時間限制 3000 ms 記憶體限制 65535 kb 難度 1 描述 已知雞和兔的總數量為n,總腿數為m。輸入n和m,依次輸出雞和兔的數目,如果無解,則輸出 no answer 不要引號 輸入第一行輸入乙個資料a,代表接下來共有幾組資料,在接下來的 a 10 a行裡,每行都有乙個n和m.0輸出 輸...

例題 雞兔同籠

問題描述 乙個籠子裡面關了雞和兔子 雞有2隻腳,兔子有4隻腳,沒有例外 已經知道了籠子裡腳的總數a,問籠子裡面至少有多少只動物,至多有多少只動物?輸入資料 第一行是測試資料的組數n,後面跟著n行輸入。每組測試資料佔一行,每行包含乙個正整數a a 32768 輸入要求 輸入包含n行,每行對應乙個輸入,...

acm雞兔同籠

描述 已知雞和兔的總數量為n,總腿數為m。輸入n和m,依次輸出雞和兔的數目,如果無解,則輸出 no answer 不要引號 輸入 第一行輸入乙個資料a,代表接下來共有幾組資料,在接下來的 a 10 a行裡,每行都有乙個n和m.0輸出 輸出雞兔的個數,或者no answer 樣例輸入 2 14 32 ...