## Java編程那些事兒39—流程控制綜合示例1
鄭州游戲學院?陳躍峰
出自:[http://blog.csdn.net/mailbomb](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);
?????????????????????????????????????????????? }
???????????????????????????????????? }
??????????????????????????? }
?????????????????? }
~~~
這樣,就可以大幅提高程序的執行效率,從而提高程序的執行速度。當然該代碼還可以繼續進行優化,那樣可以再次提供程序的執行效率。
- 前言
- (1)序言
- (2)程序設計是什么?
- (3)你適合學習程序設計嗎?
- (4)如何學好程序設計?
- (5)程序設計介紹小結
- (6)計算機軟件基本概念
- (7)進制的概念
- (8)計算機內部的數據表達
- (9)網絡編程基礎
- (10)Java語言簡介
- (11)JDK的獲得、安裝和配置
- (12)第一個HelloWorld程序
- (13)Eclipse基本使用
- (14)Eclipse基礎使用進階
- (15)如何學好Java語法
- (16)代碼框架、關鍵字和標識符
- (17)基本數據類型
- (18)變量和常量
- (19)數據類型轉換
- (20)空白、語句結束和注釋
- (21)算術運算符
- (22)比較運算符
- (23)邏輯運算符
- (24)賦值運算符
- (25)位運算符
- (26)移位運算符
- (27)其它運算符
- (28)運算符優先級
- (29)表達式
- (30)流程控制基礎
- (31)if語句語法(1)
- (32)if語句語法(2)
- (33)if語句語法(3)
- (34)switch語句語法
- (35)while語句語法
- (36)do-while語句語法
- (37)for語句語法
- (38)break和continue語句
- (39)流程控制綜合示例1
- (40)流程控制綜合示例2
- (41)流程控制綜合示例3
- (42)流程控制綜合練習
- (43)數組概述
- (44)數組基礎語法
- (45)數組使用示例1
- (46)數組使用示例2
- (47)數組使用示例3
- (48)多維數組基礎
- (49)多維數組使用示例1
- (50)多維數組使用示例2
- (51)多維數組練習
- (52)方法聲明
- (53)方法聲明示例
- (54)方法調用
- (55)方法重載和參數傳遞
- (56)方法練習
- (57)面向對象基礎
- (58)類(一)
- (59)類(二)
- (60)對象
- (61)面向對象設計方法和面向對象特性(一)
- (62)繼承(二)
- (63)多態性
- (64)訪問控制符、修飾符和其它關鍵字
- (65)static修飾符
- (66)final修飾符
- (67)this和super
- (68)抽象類和接口(一)
- (69)抽象類和接口(二)
- (70)抽象類和接口(三)
- (71)內部類簡介
- (72)包的概念
- (73)JDK文檔使用
- (74)java.lang包介紹1
- (75)String類使用
- (76)StringBuffer類和System類
- (77)包裝類
- (78)時間和日期處理
- (79)Random隨機處理
- (80)集合框架簡述
- (81)異常處理概述
- (82)異常處理語法1
- (83)異常處理語法2
- (84)IO簡介
- (85)IO類體系
- (86)文件操作之File類使用
- (87)文件操作之讀取文件
- (88)文件操作之寫文件
- (89)讀取控制臺輸入
- (90)裝飾流使用1
- (91)裝飾流使用2
- (92)IO使用注意問題
- (93)多線程基礎
- (94)多線程實現方式1
- (95)多線程實現方式2
- (96)多線程使用示例1
- (97)多線程使用示例2
- (98)多線程問題及處理1
- (99)多線程問題及處理2
- (100)多線程問題及處理3
- (101)網絡編程概述
- (102)網絡編程技術1
- (103)網絡編程技術2
- (104)網絡編程技術3
- (105)網絡編程技術4
- (106)網絡編程技術5
- (107)網絡協議概念
- (108)網絡編程示例1
- (109)網絡編程示例2
- (110)網絡編程小結