Java Home

          Java技術修煉中...
          posts - 20, comments - 22, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          求最大公約數的算法

          Posted on 2006-12-07 01:02 Yemoo'S Java Blog 閱讀(7760) 評論(4)  編輯  收藏 所屬分類: 算法與數據結構
          /**
          ?*Description:greatest?common?divisor
          ?*Author:yemoo?2006.12.06
          ?
          */

          ?
          public ? class ?Pt32{
          ????
          // 思路:輾轉相除法
          ????? int ?divisor1( int ?m, int ?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));
          ?????}

          ?}

          使用了輾轉相除法,分別使用循環和遞歸方法實現。

          吸取dreamstone大哥的程序寫法,發現判斷m、n大小的部分可以刪除,因為如果m<n求余部分會自動交換兩個變量。

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

          ?
          public?class?Pt32{
          ????
          //思路:輾轉相除法
          ?????int?divisor1(int?m,int?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: 求最大公約數的算法  回復  更多評論   

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

          # re: 求最大公約數的算法  回復  更多評論   

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

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

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

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

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

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

          # re: 求最大公約數的算法  回復  更多評論   

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

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


          網站導航:
           
          主站蜘蛛池模板: 信宜市| 承德市| 乐业县| 奉贤区| 丰都县| 陇西县| 微博| 元朗区| 岗巴县| 沙田区| 保靖县| 荥经县| 望奎县| 哈尔滨市| 天气| 保山市| 秦皇岛市| 张家口市| 湘潭县| 鲜城| 凤阳县| 公安县| 台东县| 永吉县| 闽侯县| 商城县| 潼南县| 五峰| 张家川| 万年县| 崇阳县| 汤阴县| 柳江县| 昭平县| 邵阳县| 合山市| 洞口县| 固阳县| 平罗县| 南召县| 肇东市|