- Java Web開發實例大全(基礎卷) (軟件工程師開發大系)
- 軟件開發技術聯盟
- 634字
- 2021-03-26 13:01:19
2.6 算法應用
實例046 算法應用——百錢買百雞
光盤位置:光盤\MR\02\046
高級
實用指數:
實例說明
百錢買百雞是一個很經典的算法案例,其主要內容是:公雞5元一只,母雞3元一只,小雞一元3只。問100元錢怎樣可以買100只雞,本實例運行結果如圖2.30所示。

圖2.30 實例運行結果
設計過程
只要理清條件關系,就可以很容易實現。下面編寫一個Hmhc.java將其實現,關鍵代碼如下:
package hmhc; public class Hmhc { public static void main(String[] args) { int cock, hen, chicken=0; for(cock=0; cock<=19; cock++){ for(hen=0; hen<=33; hen++){ chicken=100-cock-hen; int p; p=chicken%3; if(((5*cock+3*hen+chicken/3)==100)&&(p==0)){ System.out.print(" 可以買公雞的只數:"+cock); System.out.print(" 可以買母雞的只數:"+hen); System.out.print(" 可以買小雞的只數:"+chicken); System.out.println("\n"); } } } } }
秘笈心法
其實對于百錢買百雞的算法,只要明白各種條件之間的關系即可。而且可以知道公雞最多買20只,母雞最多買33只,小雞最多買100只。這樣只要買各種雞的錢總數是100元,雞的只數也是100只即可。
實例047 算法應用——韓信點兵
光盤位置:光盤\MR\02\047
高級
實用指數:
實例說明
韓信點兵是一道古代數學題,其內容是:韓信帶兵不足百人,3人一行排列多一人,7人一行排列少兩人,5人一行排列正好。本實例是計算出韓信究竟點了多少兵,實例運行結果如圖2.31所示。

圖2.31 實例運行結果
設計過程
只要理清條件關系,就可以很容易實現。下面編寫一個Hxin.java去實現它,實現Hxin.java類的關鍵代碼如下:
package hanxin; public class Hxin { public static void main(String[] args){ int a=0, b=0, c=0, preson; //定義總人數和各種站法的剩余人數 for(preson=0; preson<100; preson++){ a=preson%3; //每排3人的剩余人數 b=preson%7; //每排7人的剩余人數 c=preson%5; //每排5人的剩余人數 if(a==1&&b==5&&c==0){ //都符合條件時的人數 System.out.println("韓信帶的兵數是:"+preson); } } } }
秘笈心法
其實對于韓信點兵的算法,只要將7人少兩人轉換為7人多5人,這樣解決問題的方法就很明顯了,再限定一下總的人數不多于100即可。
實例048 算法應用——斐波那契數列
光盤位置:光盤\MR\02\048
高級
實用指數:
實例說明
斐波那契數列的定義為:它的第一項和第二項均為1,以后各項都為前兩項之和。本實例將介紹如何實現斐波那契數列,實例運行結果如圖2.32所示。

圖2.32 實例運行結果
設計過程
只要設計好循環,就可以很容易地實現。編寫Fbo.java類,成員f1、f2分別是表示相鄰的兩項,if條件語句用來判定符合條件的位置,用一個while循環去求整個斐波那契數列,關鍵代碼如下:
package fbo; import java.util.Scanner; public class Fbo { private static void f(int x){ int f1=1, f2=1, i=3; if(x==1)System.out.print(f1); if(x==2)System.out.print(f1+" "+f2); if(x>=3){ //求位置大于3的數列 System.out.print(f1+" "+f2); while(x>=i){ //求數列 f1=f2+f1; //求兩項之和 System.out.print(" "+f1); i++; f2=f2+f1; System.out.print(" "+f2); } } } public static void main(String[] args) { Scanner s=new Scanner(System.in); System.out.println("請輸入你想查看的斐波那契數列:"); int num=s.nextInt(); System.out.println("你想看的斐波那契數列:"); f(num/2+1); } }
秘笈心法
其實對于求斐波那契數列的算法,只要明白如何去設定一個循環即可,可以在循環中使用類似遞歸的賦值模式。
實例049 算法應用——水仙花數
光盤位置:光盤\MR\02\049
高級
實用指數:
實例說明
水仙花數是一個3位數,每一位數的立方相加等于該數本身。本實例將介紹如何實現水仙花數的算法,實例運行結果如圖2.33所示。

圖2.33 實例運行結果
設計過程
編寫Wflower.java類,用于實現水仙花數的算法,關鍵代碼如下:
package wf; public class Wflower{ public static void main(String[]args){ int a=0, b=0, c=0; System.out.println("水仙花數是:"); for(int i=100; i<1000; i++){ //遍歷所有3位數 a=i/100; //獲取3位數中百位的數 b=i%100/10; //獲取3位數中十位的數 c=i%100%10; //獲取3位數中個位的數 a=a*a*a; //計算第一位數的立方 b=b*b*b; //計算第二位數的立方 c=c*c*c; //計算第3位數的立方 if((a+b+c)==i) //如果符合水仙花數 System.out.print(" "+i); } } }
秘笈心法
其實對于求水仙花數的算法,只要明白如何去設定一個循環即可。在循環中,對100~1000之內的數進行遍歷,只要符合條件的即可進行輸出。
實例050 算法應用——素數
光盤位置:光盤\MR\02\050
高級
實用指數:
實例說明
對于素數的定義是,如果一個數只能被1和它本身整除,那么這個數就是素數。本實例介紹如何實現素數的算法,實例運行結果如圖2.34所示。

圖2.34 實例運行結果
設計過程
編寫Sushu.java類,用于實現素數的算法,關鍵代碼如下:
package sushu; import java.util.Scanner; public class Sushu { public static void main(String[] args) { Scanner s=new Scanner(System.in); System.out.println("請輸入你要判斷的數!"); int x=s.nextInt(); int i=2, flage=0; while(flage==0&&i<x){ //對除數進行遍歷 if(x%i==0){ //判斷是否被整除 flage=1; } else{ i++; } } if(flage==0){ //對標記進行判斷 System.out.println(x+"是素數!"); } else{ System.out.println(x+"不是素數!"); } } }
秘笈心法
素數的算法可以用一個標記和一個while循環來實現。首先將標記初始化為零,用while循環去實現從1到要判斷的數的前一位的遍歷,每遍歷一個數做一個判斷,如果可以被1和要判斷數本身之外的數整除,就將標記設置為非零的值,并跳出循環進行對標記的判斷。
實例051 算法應用——漢諾塔
光盤位置:光盤\MR\02\051
高級
實用指數:
實例說明
漢諾塔問題是一個古典數學問題,其內容是:古代有一個梵塔,塔內有3個座,即A、B、C,開始時A座上有64個盤子,盤子的大小不等,大的在下面,小的在上面。有一個老和尚想把這64個盤子從A座移到C座,但每次只允許移動一個盤子,且在移動過程中3個座上的都要保持大盤子在下面,小盤子在上面。本實例將介紹如何實現漢諾塔的算法,實例運行結果如圖2.35所示。

圖2.35 實例運行結果
關鍵技術
知道了問題,那么就來討論一下過程:將n個盤子從一個座移到另一個座上,這是每個移動者要做的。除去第一個移動者外,其他都要命令其他的移動者,就是第一個移動者開始,任務層層下放,最后將一個盤子從一個座上移到另一個座上,這是第一個移動者自己做的工作。
設計過程
創建Hanoi.java類,編寫move()方法,將一個盤子從一個座移到另一個座;編寫hanoit()方法,參數one、two和three分別表示座一、座二和座三的變量,將盤子從one移到three座。Hanoi.java類的關鍵代碼如下:
package digui; import java.util.Scanner; public class Hanoi { private static void move(char x, char y){ System.out.printf("%c-->%c", x, y); System.out.print("\n"); } //將n個盤子從第一座借助第二座移到第三座 private static void hanoit(int n, char one, char two, char three){ if(n==1){ //如果只有一個盤子 move(one, three); } else{ hanoit(n-1, one, three, two); //將一上的盤子借助三移到二上 move(one, three); hanoit(n-1, two, one, three); //將二上的盤子借助一移到三上 } } public static void main(String[] args) { int m; System.out.println("請輸入你要移動的盤子數:"); Scanner s=new Scanner(System.in); m=s.nextInt(); System.out.println("移動"+m+"個盤子的步驟如下"); hanoit(m, 'A', 'B', 'C'); } }
秘笈心法
漢諾塔的算法是典型遞歸問題的算法,一定要控制好遞歸的條件;否則,很容易造成死循環。
- Practical Data Analysis Cookbook
- .NET之美:.NET關鍵技術深入解析
- Vue.js 2 and Bootstrap 4 Web Development
- 少年輕松趣編程:用Scratch創作自己的小游戲
- jQuery從入門到精通 (軟件開發視頻大講堂)
- Windows Server 2012 Unified Remote Access Planning and Deployment
- Interactive Applications Using Matplotlib
- 網絡爬蟲原理與實踐:基于C#語言
- SQL基礎教程(第2版)
- Getting Started with LLVM Core Libraries
- Learning R for Geospatial Analysis
- NetBeans IDE 8 Cookbook
- C++ Application Development with Code:Blocks
- Joomla!Search Engine Optimization
- 青少年Python趣味編程