Java Home

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

          求最大公約數的算法

          Posted on 2006-12-07 01:02 Yemoo'S Java Blog 閱讀(7761) 評論(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);}
          }

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


          網站導航:
           
          主站蜘蛛池模板: 武陟县| 马公市| 吴江市| 平遥县| 陕西省| 宽城| 涿鹿县| 昌黎县| 河北省| 合作市| 镇雄县| 纳雍县| 临朐县| 隆尧县| 凌云县| 德兴市| 博客| 增城市| 嘉善县| 绿春县| 伊春市| 得荣县| 呼玛县| 秭归县| 手游| 崇明县| 牟定县| 南开区| 灯塔市| 将乐县| 平阴县| 通江县| 弥勒县| 若尔盖县| 江孜县| 嘉峪关市| 台南县| 昌宁县| 双流县| 民县| 托克托县|