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);
}
}
}
}
這樣,就可以大幅提高程序的執行效率,從而提高程序的執行速度。當然該代碼還可以繼續進行優化,那樣可以再次提供程序的執行效率。