Java編程那些事兒39—流程式控制制綜合樣本1鄭州遊戲學院 陳躍峰出自:http://blog.csdn.net/mailbomb
5.6 綜合樣本 在一般的學校學習流程式控制制時,重點是放在流程式控制制的相關文法,其實為了能成為一個合格的程式員,僅僅學好文法是遠遠不夠的,還需要通過大量的練習來適應程式設計語言的思維方式,並且熟練地把自己的解決問題的步驟形成代碼,這些都需要通過大量的閱讀代碼和編寫代碼來實現。 所以在學習流程式控制制時,重點是解決實際的問題,而不是僅僅停留在文法層面上,這個是很多在校學生學習程式時最突出的一個問題。 在遇到一個實際問題時,首先要能夠思考出解決這個問題的數學步驟或邏輯步驟,然後才能編寫對應的代碼,所以遇到實際問題是,一定要積極思考,並且善于思考,對於一個相同的問題,不同的邏輯就可以寫出不同的代碼,所以在思考解決問題的方式時,需要進行發散性的思維,而這些理性的思維很多都是建立在數學基礎以及對文法的熟悉基礎之上。 下面,通過一系列的實際問題,來說明解決實際問題的步驟以及書寫的對應的代碼。
5.6.1 樣本講解
5.6.1.1 最大公約數 問題:求兩個自然數的最大公約數。這兩個都是基礎的數學問題,最大公約數指兩個數字公用的約數中最大的,例如數字6的約數有1、2、3、6,數字9的約數有1、3、9,則數字6和數字9的公用約數有1和3,其中3是最大的公約數。 第一種思路:從1開始迴圈,每次把符合要求(即同時是兩個數位約數)的值都儲存起來,那麼最後一個儲存起來的就是最大的約數。 則實現的代碼如下: int n = 6; int m = 9; int result = 1; for(int i = 1;i <= n;i++){ if((n % i == 0) && (m % i == 0)){ result = i; } } System.out.println(result); 使用該思路,每次都儲存得到的公用約數,那麼最後一個儲存的就是兩個數位最大公約數。 第二種思路:從兩個數字中最小的數字開始迴圈,每次減1,那麼第一次得到的公用約數就是所求的最大公約數。 則實現的代碼如下: int n = 6; int m = 9; int result = n > m ?m : n; for(int i = result;i >= 1;i--){ if((n % i == 0) && (m % i == 0)){ result = i; break; //結束迴圈 } } System.out.println(result); 當然,解決這個問題,還有很多其它的方法,這裡示範的這兩種實現只是最自然的實現而已,採用類似的原理也可以求兩個數位最小公倍數的結構。
5.6.1.2 百元百雞問題 問題描述:每隻母雞3元,每隻公雞4元,每隻小雞0.5元,如果花100元錢買100隻雞,請問有哪些可能?說明:每種雞的數量都可以為零。 其實這個問題是數學上的組合問題,只需要把所有的情況列舉出來,然後來判斷是否符合要求即可。這樣的重複列舉的問題,在程式上可以使用迴圈進行解決。 第一種思路:當母雞的數量為0時,公雞的數量從0-100,當公雞的數量每變化一次,小雞的數量就從0變化到100,使用如下數值組合來描述這個思路: 母雞數量 公雞數量 小雞數量 0 0 從0變化到100 0 1 從0變化到100 0 2 從0變化到100 …… 1 0 從0變化到100 1 1 從0變化到100 …… 100 100 100 上面列舉出了所有公雞、母雞和小雞的數量都是0-100時的所有組合,總計是101的三次方種,這樣的窮舉結構直接存在嵌套,在程式實際實現時,通過迴圈之間的嵌套就可以實現,則實現的代碼如下: for(int i = 0;i <= 100;i++){ //母雞數量 for(int j = 0;j <= 100;j++){ //公雞數量 for(int k = 0;k <= 100;k++){ //小雞數量 //判斷數量是否為100,以及金額是否為100 if((i +j + k == 100) && (i * 3 + j * 4 + k * 0.5 == 100)){ System.out.println(“母雞數量:” + i + “ 公雞數量:” + j + “ 小雞數量” + k); } } } } 按照for語句的執行流程,迴圈變數變化1,則內部的迴圈執行一次,而在迴圈嵌套時,迴圈體又是一個新的迴圈,則該迴圈執行完成的一組迴圈。這裡通過迴圈的嵌套實現了所有數值的窮舉。在迴圈的內部,只需要按照題目要求判斷一下數量和金額是否符合要求即可。 但是這樣的代碼效率比較差,可以通過簡單的最佳化來提高程式的執行效率。 第二種思路:由於母雞每隻的金額是3元,所以100元最多購買的母雞數量是100/3=33隻,同理100元最多購買的公雞數量是25隻,而按照100元100隻的要求,小雞的數量應該為100減去公雞和母雞的數量,這樣代碼就可以簡化為如下的結構: for(int i = 0;i <= 33;i++){ //母雞數量 for(int j = 0;j <= 25;j++){ //公雞數量 int k = 100 –i – j; //小雞數量 //判斷金額是否為100 if (i * 3 + j * 4 + k * 0.5 == 100){ System.out.println(“母雞數量:” + i + “ 公雞數量:” + j + “ 小雞數量” + k); } } } } 這樣,就可以大幅提高程式的執行效率,從而提高程式的執行速度。當然該代碼還可以繼續進行最佳化,那樣可以再次提供者的執行效率。