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

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

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

    我的漫漫程序之旅

    專(zhuān)注于JavaWeb開(kāi)發(fā)
    隨筆 - 39, 文章 - 310, 評(píng)論 - 411, 引用 - 0
    數(shù)據(jù)加載中……

    輾轉(zhuǎn)相除法原理及Java實(shí)現(xiàn)

    輾轉(zhuǎn)相除法
    「輾轉(zhuǎn)相除法」又叫做「歐幾里得算法」,是公元前 300 年左右的希臘數(shù)學(xué)家歐幾里得在他的著作《幾何原本》提出的.利用這個(gè)方法,可以較快地求出兩個(gè)自然數(shù)的最大公因數(shù),即 HCF 或叫做 gcd.
    最大公約數(shù)(greatest common divisor,簡(jiǎn)寫(xiě)為gcd;或highest common factor,簡(jiǎn)寫(xiě)為hcf)
    所謂最大公因數(shù),是指幾個(gè)數(shù)的共有的因數(shù)之中最大的一個(gè),例如 8 和 12 的最大公因數(shù)是 4,記作 gcd(8,12)=4.
    在介紹這個(gè)方法之前,先說(shuō)明整除性的一些特點(diǎn),注以下文的所有數(shù)都是正整數(shù),以后不再重覆.
    我們可以這樣給出整除以的定義:
    對(duì)於兩個(gè)自然數(shù) a 和 b,若存在正整數(shù) q,使得 a=bq,則 b 能整除 a,記作 b | a,我們叫 b 是 a 的因數(shù),而 a 是 b 的倍數(shù).
    那麼如果 c | a,而且 c | b,則 c 是 a 和 b 的公因數(shù).
    由此,我們可以得出以下一些推論:
    推論一:如果 a | b,若 k 是整數(shù),則 a | kb.因?yàn)橛?a | b 可知 ha=b,所以 (hk)a=kb,即 a | kb.
    推論二:如果 a | b 以及 a | c,則 a | (b±c).因?yàn)橛?a | b 以及 a | c,可知 ha=b,ka=c,二式相加,得 (h+k)a=b+c,即 a | (b+c).同樣把二式相減可得 a | (b-c).
    推論三:如果 a | b 以及 b | a,則 a=b.因?yàn)橛?a | b 以及 b | a,可知 ha=b,a=kb,因此 a=k(ha),hk=1,由於 h 和 k 都是正整數(shù),故 h=k=1,因此 a=b.
    輾轉(zhuǎn)相除法是用來(lái)計(jì)算兩個(gè)數(shù)的最大公因數(shù),在數(shù)值很大時(shí)尤其有用而且應(yīng)用在電腦程式上也十分簡(jiǎn)單.其理論如下:
    如果 q 和 r 是 m 除以 n 的商及余數(shù),即 m=nq+r,則 gcd(m,n)=gcd(n,r).
    證明是這樣的:
    設(shè) a=gcd(m,n),b=gcd(n,r)
    則有 a | m 及 a | n,因此 a | (m-nq)(這是由推論一及推論二得出的),即 a | r 及 a | n,所以 a | b
    又 b | r 及 b | n,所以 b | (nq+r),即 b | m 及 b | n,所以b | a.因?yàn)?a | b 并且 b | a,所以 a=b,即 gcd(m,n)=gcd(n,r).
    例如計(jì)算 gcd(546, 429),由於 546=1(429)+117,429=3(117)+78,117=1(78)+39,78=2(39),因此
    gcd(546, 429)
    =gcd(429, 117)
    =gcd(117, 78)
    =gcd(78, 39)
    =39

    Java實(shí)現(xiàn)代碼如下:

    package com;

    public class GcdTest
    {
        
    //循環(huán)實(shí)現(xiàn)
        int gcd1(int a, int b)
        
    {
            
    int k = 0;
            
    do
            
    {
                
    //得到余數(shù)
                k = a % b;
                
    //根據(jù)輾轉(zhuǎn)相除法,把被除數(shù)賦給除數(shù)
                a = b;
                
    //余數(shù)賦給被除數(shù)
                b = k;
            }
     while (k != 0);
            
    //返回被除數(shù)
            return a;
        }

        
    //逆歸實(shí)現(xiàn)
        int gcd2(int a,int b)
        
    {
            
    //直到滿(mǎn)足此條件逆歸退出
            if(b == 0)
            
    {
                
    return a;
            }

            
    if(a < 0)
            
    {
                
    return gcd2(-a,b);
            }

            
    if(b < 0)
            
    {
                
    return gcd2(a,-b);
            }

            
    return gcd2(b,a % b);
        }

        
        
    public static void main(String[] args)
        
    {
            GcdTest gt 
    = new GcdTest();
            System.out.println(gt.gcd1(
    888,458));
            System.out.println(gt.gcd2(
    888458));
        }


    }



    posted on 2007-12-28 12:41 々上善若水々 閱讀(8232) 評(píng)論(1)  編輯  收藏 所屬分類(lèi): 數(shù)據(jù)結(jié)構(gòu)與算法

    評(píng)論

    # re: 輾轉(zhuǎn)相除法原理及Java實(shí)現(xiàn)  回復(fù)  更多評(píng)論   

    謝謝你的原理解釋和程序,很好。
    不過(guò)實(shí)現(xiàn)程序還缺少一些對(duì)輸入數(shù)據(jù)的限制哦,如b=0等。
    2008-11-06 23:24 | 一笑而過(guò)
    主站蜘蛛池模板: 青青草原1769久久免费播放| 免费国产黄线在线观看| 国产免费爽爽视频在线观看 | 亚洲AV乱码一区二区三区林ゆな| 亚洲免费观看在线视频| 国外成人免费高清激情视频| 成人毛片免费视频| 四虎免费久久影院| 亚洲AV无码1区2区久久| 亚洲视频一区二区三区四区| 亚洲精品国产首次亮相| 全黄大全大色全免费大片| 亚洲美女免费视频| 日韩电影免费在线观看视频 | 性色av无码免费一区二区三区| 一级看片免费视频| 在线观看免费av网站| 麻豆成人精品国产免费| 亚洲av中文无码乱人伦在线播放| 亚洲人成色7777在线观看不卡| 好吊妞视频免费视频| 国产亚洲精品无码成人| 亚洲色最新高清av网站| 大地资源在线资源免费观看| 毛色毛片免费观看| 日韩精品亚洲aⅴ在线影院| 性xxxx黑人与亚洲| 国产一区二区免费视频| 国产片免费在线观看| 久久久亚洲欧洲日产国码是AV | 最近新韩国日本免费观看| 又黄又大又爽免费视频| 亚洲欧洲日韩国产| a毛片全部免费播放| 国产午夜影视大全免费观看| 亚洲av片劲爆在线观看| japanese色国产在线看免费| 成人无遮挡毛片免费看| 亚洲精品在线免费观看| 免费看男人j放进女人j免费看| 一区二区三区四区免费视频|