## Java編程那些事兒40—流程控制綜合示例2
鄭州游戲學院?陳躍峰
出自:[http://blog.csdn.net/mailbomb](http://blog.csdn.net/mailbomb)
**5.6.1.3 喝汽水問題**
問題:共有1000瓶汽水,每喝完后一瓶得到的一個空瓶子,每3個空瓶子又能換1瓶汽水,喝掉以后又得到一個空瓶子,問總共能喝多少瓶汽水,最后還剩余多少個空瓶子?
這個問題其實是個比較典型的遞推問題,每3個空瓶都可以再換1瓶新的汽水,這樣一直遞推下去,直到最后不能換到汽水為止。
第一種思路:每次喝一瓶,每有三個空瓶子就去換一瓶新的汽水,直到最后沒有汽水可以喝為止。在程序中記憶汽水的數量和空瓶子的數量即可。
則實現的代碼如下:
~~~
?????????????????? int num = 1000;??? ???//汽水數量
?????????????????? int drinkNum = 0;?? ??//喝掉的汽水數量
?????????????????? int emptyNum = 0;???//空瓶子的數量
?????????????????? while(num > 0){??? ??//有汽水可以喝
??????????????????????????? num--;???????? //喝掉一瓶
??????????????????????????? emptyNum++;?//空瓶子數量增加1
??????????????????????????? drinkNum++;?? //喝掉的汽水數量增加1
??????????????????????????? if(emptyNum == 3){?//有3個空瓶子,則去換
???????????????????????????????????? num++;?? //汽水數量增加1
???????????????????????????????????? emptyNum = 0;?? //空瓶子數量清零
??????????????????????????? }
?????????????????? }
?????????????????? System.out.println(“總共喝掉瓶數:” + drinkNum);
?????????????????? System.out.println(“剩余空瓶子數:” + emptyNum);
~~~
執行該程序,輸出結果如下:
總共喝掉瓶數:1499
剩余空瓶子數:2
在該代碼中,每次循環喝掉一瓶汽水,則汽水數量減少1,空瓶子數增加1,喝掉的總汽水瓶數增加1,每次判斷空瓶子的數量是否達到3,如果達到3則換1瓶汽水,同時空瓶子的數量變為零。這種思路比較直觀,但是循環的次數比較多,所以就有了下面的邏輯實現。
第二種思路:一次把所有的汽水喝完,獲得所有的空瓶子,再全部換成汽水,然后再一次全部喝完,再獲得所有的空瓶子,依次類推,直到沒有汽水可喝為止。
則實現的代碼如下:
~~~
?????????????????? int num = 1000;?????? //汽水數量
?????????????????? int drinkNum = 0;???? //喝掉的汽水數量
?????????????????? int emptyNum = 0;??? //空瓶子的數量
?????????????????? while(num > 0){????? //有汽水可以喝
??????????????????????????? drinkNum += num;?//喝掉所有的汽水
??????????????????????????? emptyNum += num; //空瓶子數量等于上次剩余的加上這次喝掉的數量
??????????????????????????? num = emptyNum / 3;?//兌換的汽水數量
??????????????????????????? emptyNum -= num * 3;?//本次兌換剩余的空瓶子數量
?????????????????? }
?????????????????? System.out.println(“總共喝掉瓶數:” + drinkNum);
?????????????????? System.out.println(“剩余空瓶子數:” + emptyNum);
~~~
在該代碼中,每次喝掉所有的汽水,也就是num瓶,則喝掉的總瓶數每次增加num,因為每次都可能剩余空瓶子(不足3個的),則總的空瓶子數量是上次空瓶子數量加上本次喝掉的num瓶。接著是對話汽水,則每次可以兌換的汽水數量是空瓶子的數量的1/3,注意這里是整數除法,而本次兌換剩余的空瓶子數量是原來的空瓶子數量減去兌換得到汽水數量的3倍,這就是一次循環所完成的功能,依次類推即可解決該問題。
**5.6.1.4水仙花數**
問題:水仙花數指三位數中,每個數字的立方和和自身相等的數字,例如370,3 × 3 × 3 + 7 × 7 × 7 + 0 × 0 × 0 =370,請輸出所有的水仙花數。
該問題中體現了一個基本的算法——數字拆分,需要把一個數中每位的數字拆分出來,然后才可以實現該邏輯。
實現思路:循環所有的三位數,拆分出三位數字的個位、十位和百位數字,判斷3個數字的立方和是否等于自身。
則實現的代碼如下所示:
~~~
?????????????????? for(int i = 100;i < 1000;i++){ //循環所有三位數
??????????????????????????? int a = i % 10;???????? //個位數字
??????????????????????????? int b = (i / 10) % 10; //十位數字
??????????????????????????? int c = i / 100;?????? //百位數字
??????????????????????????? //判斷立方和等于自身
??????????????????????????? if(a * a * a + b * b * b + c * c * c == i){
???????????????????????????????????? System.out.println(i);
??????????????????????????? }
?????????????????? }
~~~
在該代碼中,拆分個位數字使用i和10取余即可,拆分十位數字時首先用i除以十,去掉個位數字,并使原來的十位數字變成個位,然后和10取余即可,因為i是一個三位數,所以i除以100即可得百位數字,因為這里都是整數除法,不存在小數的問題。然后只需要判斷立方和是否等于自身即可。
注意:因為i是循環變量,這里不能改變i的值,不然可能造成死循環。
- 前言
- (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)網絡編程小結