Java Home

          Java技術(shù)修煉中...
          posts - 20, comments - 22, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理
          /**
          ?*Description:greatest?common?divisor
          ?*Author:yemoo?2006.12.06
          ?
          */

          ?
          public ? class ?Pt32{
          ????
          // 思路:輾轉(zhuǎn)相除法
          ????? int ?divisor1( int ?m, int ?n){???? // 方法一:循環(huán)法
          ????????? int ?temp;
          ?????????
          if (m < n){???? // if?m<n,swap?m,n
          ?????????????temp = m;
          ?????????????m
          = n;
          ?????????????n
          = temp;
          ?????????}
          ?????????
          while (m % n != 0 ){
          ?????????????temp
          = n;
          ?????????????n
          = m % n;
          ?????????????m
          = temp;
          ?????????}
          ?????????
          return ?n;
          ?????}

          ?????
          int ?divisor2( int ?m, int ?n){???? // 方法二:遞歸法
          ????????? int ?temp;
          ?????????
          if (m < n){
          ?????????????temp
          = m;
          ?????????????m
          = n;
          ?????????????n
          = temp;
          ?????????}
          ?????????
          return ?divisor22(m,n);
          ?????}

          ????
          int ?divisor22( int ?m, int ?n){
          ????????
          if (m % n == 0 ){
          ????????????
          return ?n;
          ????????}
          else {
          ????????????
          return ?divisor22(n,m % n);
          ????????}
          ????}

          ?????
          public ? static ? void ?main(String?args[]){
          ?????????KeyboardInput?in
          = new ?KeyboardInput();
          ?????????Pt32?obj
          = new ?Pt32();
          ?????????System.out.println(
          " input?two?integer: " );
          ?????????
          int ?a = in.readInt();
          ?????????
          int ?b = in.readInt();
          ?????????System.out.println(a
          + " , " + b + " 's?greatest?common?divisor?is? " + obj.divisor2(a,b));
          ?????}

          ?}

          使用了輾轉(zhuǎn)相除法,分別使用循環(huán)和遞歸方法實現(xiàn)。

          吸取dreamstone大哥的程序?qū)懛ǎl(fā)現(xiàn)判斷m、n大小的部分可以刪除,因為如果m<n求余部分會自動交換兩個變量。

          改進后程序代碼(精簡了好多哦):
          /**
          ?*Description:greatest?common?divisor
          ?*Author:yemoo?2006.12.07?
          */

          ?
          public?class?Pt32{
          ????
          //思路:輾轉(zhuǎn)相除法
          ?????int?divisor1(int?m,int?n){????//方法一:循環(huán)法
          ?????????int?temp;
          ?????????
          while(m%n!=0){
          ?????????????temp
          =n;
          ?????????????n
          =m%n;
          ?????????????m
          =temp;
          ?????????}
          ?????????
          return?n;
          ?????}

          ?????
          int?divisor2(int?m,int?n){????//方法二:遞歸法
          ?????????if(m%n==0){
          ????????????
          return?n;
          ????????}
          else{
          ????????????
          return?divisor2(n,m%n);
          ????????}
          ?????}

          ?????
          public?static?void?main(String?args[]){
          ?????????KeyboardInput?in
          =new?KeyboardInput();
          ?????????Pt32?obj
          =new?Pt32();
          ?????????System.out.println(
          "input?two?integer:");
          ?????????
          int?a=in.readInt();
          ?????????
          int?b=in.readInt();
          ?????????System.out.println(a
          +","+b+"'s?greatest?common?divisor?is?"+obj.divisor2(a,b));
          ?????}

          ?}

          評論

          # re: 求最大公約數(shù)的算法  回復(fù)  更多評論   

          2006-12-07 23:19 by dreamstone
          其實象求最大公約數(shù)等數(shù)學(xué)相關(guān)的需求,首先要考慮的是數(shù)學(xué)上有沒有算法,而不應(yīng)該是直接便利或者遞歸。比如公約數(shù)可以利用歐幾里得定理,見這里:
          http://www.aygfsteel.com/dreamstone/archive/2006/09/22/71221.html
          性能會有很大的提升

          # re: 求最大公約數(shù)的算法  回復(fù)  更多評論   

          2006-12-08 00:22 by Yemoo'S Java Blog
          hoho!大哥應(yīng)該沒有詳細看偶的算法吧?

          偶的這兩個算法不就等同于你的第三個寫法中的算法嗎?只是用兩種程序結(jié)構(gòu)體現(xiàn)出來了。還是同一個算法(相除求余)。

          歐幾里得是否就是那個遞歸求差的算法(您寫的第二個)?

          不過要感謝大哥你的程序啟發(fā).
          偶發(fā)現(xiàn)如下判斷大小部分可以去掉:
          if (m < n){
          temp = m;
          m = n;
          n = temp;
          }
          因為如果m<n則第一次求余過程中也會交換兩個變量,這點偶向復(fù)雜了,偶的算法改進下。

          # re: 求最大公約數(shù)的算法[未登錄]  回復(fù)  更多評論   

          2009-11-25 12:28 by free
          你如果一個數(shù)是9,一個是17,兩個沒公約數(shù)的數(shù)呢?怎么判斷?

          # re: 求最大公約數(shù)的算法  回復(fù)  更多評論   

          2010-04-17 19:04 by scsdfy
          丫的,上面的都運行不了。我才是最強滴男人,我來寫個最簡單的:
          import java.util.Scanner;
          public class UseRecursion
          {
          public static void main(String[] args)
          { Scanner scanner =new Scanner(System.in);
          System.out.println("shu ru:");
          System.out.print("m= ");
          int m=scanner.nextInt();
          System.out.print("n= ");
          int n=scanner.nextInt();
          System.out.println("GCD: "+gcd(m,n));
          }
          private static int gcd(int m,int n)
          {
          if (n==0) return m;
          else return gcd(n,m%n);}
          }

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 高雄市| 朝阳县| 将乐县| 桑植县| 祁东县| 南汇区| 玉龙| 巴彦淖尔市| 香河县| 德保县| 安乡县| 柘城县| 湖口县| 信丰县| 休宁县| 鲜城| 囊谦县| 和硕县| 醴陵市| 陕西省| 法库县| 墨玉县| 水富县| 辽源市| 绥阳县| 连江县| 南岸区| 博野县| 蓬莱市| 文山县| 报价| 萍乡市| 邛崃市| 香河县| 方正县| 东丰县| 五河县| 黑龙江省| 宁化县| 淳安县| 新民市|