1. 程式人生 > >利用JAVA實現“百雞百錢”問題

利用JAVA實現“百雞百錢”問題

題目:公雞5元一隻,母雞3元一隻,3只小雞1元,如果用100元錢,買100只雞,不佘不欠,可以買公雞,母雞,小雞,各多少隻。

分析

這個問題可以說是高階語言中的經典問題了,利用簡單的演算法和邏輯來解決簡單的數學問題是可以用基本語法可以解決的。

我們先假設都買公雞,100元最多隻能買20只公雞,絕對不可能達到100只。假如100元都買母雞,最多隻能買到33.333333333333…..只母雞(可憐最後的三分之一隻),這也是很明顯不存在的。。。

這裡其實用到了”假設極限”的思想(是不是瞬間覺得高大上了呢?),利用這種思想我們可以確定迴圈體的上界。

根據上面所說的,在錢數為100元的前提下,公雞最多隻能買到20只,這裡就要用到for()

迴圈體了,迴圈變數則為公雞的數量。將從買1只公雞一直到買20只公雞作為最外層的迴圈,我們在從買1只公雞,一直到買20只公雞作為第二個前提條件(第一個前提條件為總金額一定是100),這樣我們在考慮下一層迴圈。

for(rooster=1;rooster<=20;rooster++){}  

在第二層迴圈中,我們依舊會使用for()迴圈體,用母雞的個數作為迴圈變數。因為我們由最開始的分析得知,母雞最多隻能買到33.33333..只,這樣我們在只有100元的前提下,最多隻能買到33只整雞,這當然也是遠不能滿足我們的條件的,但是因為這裡是第二層迴圈,我們可以最外層迴圈(也就是“公雞”迴圈)相互匹配,從而找到花100元買100只雞的方法。

for(rooster=1;rooster<=20;rooster++){
for(hen=1;hen<=33;hen++){
}
}

這裡所用到的思想是”組合”思想,其實迴圈結構巢狀就是各種組合的嘗試(因為專業的緣故,我更喜歡叫它“X、Y掃描行為”),說白了就是在確定外層迴圈的某一數值下,內層迴圈全部迴圈完畢之後,再在外層迴圈變數上變換,之後再跳到內層迴圈繼續迴圈完畢內部迴圈,再跳到外層。。。。。。。以此類推,直到外層迴圈條件不再滿足,既可以跳出整個迴圈,得到我們想要的結果。

   chick=100-rooster-hen;

這裡的chick變數就是小雞的數量。而在之後的if()

條件語句中,利用題目規定的”花費總金額為100元”以及”小雞的數量一定能被3整除”作為判斷條件,可以列出下列判斷語句

if(5*rooster+3*hen+(1.0/3)*chick==100 && chick%3==0)

這兩個條件必須是同時成立才能達到題目的要求。
這樣一來問題便迎刃而解了。

實驗

以下是我第一次程式設計時的原始碼

package com.tencentos;
public class Week1homework2 {
public static void main(String[] args) {
    int rooster,hen,chick;
    for(rooster=1;rooster<=20;rooster++){
        for(hen=1;hen<=33;hen++){
            chick=100-rooster-hen;
            if(5*rooster+3*hen+(1/3)*chick==100 && chick%3==0){
                System.out.println("rooster:"+rooster+"\then:"+hen+"\t  chick:"+chick);
            }
            }
        }
    }
}
}

而後輸出的結果為
這裡寫圖片描述

乍一眼看上去感覺沒有錯誤,但是憑藉我多年的高(加)數(減)經驗一下子就發現了,答案是錯的。
因為8*5+20*3=100,等於後面的小雞數量雖然能被3整除,但是完全沒有用上。下面所得到的結果也是一樣的情況。

猛然間反應過來,一定是判斷語句中chick那一項等於0了。

果不其然,我犯了初學者都會遇到的錯誤

if(5*rooster+3*hen+(1/3)*chick==100 && chick%3==0)

在運算使用if()條件句計算1/3的時候,因為1與3都為int型別,並且chick也在開始時被我定義為了int型別,這樣一來當運算1/3的時候,結果只會是int型別的0值,從而運算的結果無論chick的值多少,都會使得chick的價錢花費了0元。

至於解決的辦法,想了一下應該將式子中的1或3改為1.0或3.0,並且將chick定義為double型別,這樣一來在當數值型別轉換的時候,小範圍的int型別就被轉換為了double型別,這樣的話計算1.0/3.0時,就不會得到0的返回值了。所以正確的源程式如下

package com.tencentos;
public class Week1homework2 {
public static void main(String[] args) {
    int rooster,hen;
    double chick;
    for(rooster=1;rooster<=20;rooster++){
        for(hen=1;hen<=33;hen++){
            chick=100-rooster-hen;
            if(5*rooster+3*hen+(1.0/3.0)*chick==100 && chick%3==0){
                System.out.println("rooster:"+rooster+"\then:"+hen+"\t  chick:"+chick);
            }
        }
    }
}
}

得到此題的正確解為

這裡寫圖片描述

Enjoy it~