<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://m.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);}
    }

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


    網站導航:
     
    主站蜘蛛池模板: 午夜小视频免费观看| 久久天天躁狠狠躁夜夜免费观看| 日本免费网站在线观看| 亚洲砖码砖专无区2023 | 最新亚洲卡一卡二卡三新区| 9420免费高清在线视频| 亚洲视频一区二区三区| 黄在线观看www免费看| 亚洲日韩国产精品乱-久| 成人午夜视频免费| 免费在线观看自拍性爱视频| 亚洲无码精品浪潮| 高清永久免费观看| 亚洲va在线va天堂va888www| 亚洲精品在线免费观看| 99久久国产亚洲综合精品| 国产伦精品一区二区三区免费下载| 男男gvh肉在线观看免费| 国产日产亚洲系列| 免费在线中文日本| 亚洲成人动漫在线观看| 免费无码又爽又高潮视频 | 亚洲色偷偷色噜噜狠狠99网| 国产色婷婷精品免费视频| 一级免费黄色大片| 亚洲一区二区三区电影| 国产成人A在线观看视频免费| 亚洲av无码专区在线电影| 亚洲日本乱码在线观看| 免费观看无遮挡www的视频| 亚洲欧洲无码一区二区三区| 亚洲国产成人乱码精品女人久久久不卡 | 久久伊人亚洲AV无码网站| 三年片在线观看免费西瓜视频| 亚洲狠狠狠一区二区三区| 四虎影视精品永久免费| 免费女人高潮流视频在线观看| 亚洲av无码一区二区三区天堂| 亚洲日韩精品一区二区三区| 好爽…又高潮了毛片免费看| 在线观看免费黄网站|