官术网_书友最值得收藏!

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');
        }
        }

秘笈心法

漢諾塔的算法是典型遞歸問題的算法,一定要控制好遞歸的條件;否則,很容易造成死循環。

主站蜘蛛池模板: 湖口县| 静安区| 饶阳县| 凌云县| 会东县| 台州市| 彩票| 大化| 潜山县| 忻城县| 鄂尔多斯市| 无棣县| 南昌县| 渝中区| 崇左市| 安陆市| 什邡市| 凤凰县| 安仁县| 兰考县| 东光县| 四子王旗| 广南县| 宁明县| 凌源市| 康保县| 韩城市| 甘肃省| 论坛| 延安市| 修水县| 武强县| 达孜县| 株洲市| 沛县| 资溪县| 东莞市| 通榆县| 资兴市| 吉木萨尔县| 山丹县|