<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Java Home

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

    求最大公約數的算法

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

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


    網站導航:
     
    主站蜘蛛池模板: 国产午夜亚洲精品午夜鲁丝片| 亚洲香蕉免费有线视频| 十八禁在线观看视频播放免费| 亚洲大片在线观看| 麻豆精品国产免费观看| A级毛片成人网站免费看| 亚洲无吗在线视频| 毛茸茸bbw亚洲人| 最近中文字幕国语免费完整| 无码亚洲成a人在线观看| 亚洲专区在线视频| 国产一级理论免费版| 亚洲无线一二三四区手机| 精品国产免费一区二区三区香蕉| 亚洲国产精品一区二区久| 国产午夜亚洲精品国产成人小说| 亚洲一级毛片免费在线观看| 黄色毛片免费网站| 亚洲国产精品成人综合久久久| 亚洲高清无码专区视频| 97在线线免费观看视频在线观看| xvideos永久免费入口| 亚洲日本久久久午夜精品| 好看的电影网站亚洲一区| 永久免费毛片手机版在线看| 人人玩人人添人人澡免费| 黄色毛片免费网站| 亚洲熟妇成人精品一区| 亚洲视频2020| 亚洲中文字幕无码中文字在线| 免费无码又爽又刺激高潮的视频 | 亚洲天堂免费在线视频| 亚洲日本久久久午夜精品| 久久久无码精品亚洲日韩蜜臀浪潮 | 亚洲中文字幕无码久久2020| 无码久久精品国产亚洲Av影片| 亚洲精品无码久久毛片| 日本免费人成黄页网观看视频| 国产精品成人观看视频免费| 国产偷伦视频免费观看| 成人免费777777被爆出|