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

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

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

    我的漫漫程序之旅

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

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

    輾轉相除法
    「輾轉相除法」又叫做「歐幾里得算法」,是公元前 300 年左右的希臘數(shù)學家歐幾里得在他的著作《幾何原本》提出的.利用這個方法,可以較快地求出兩個自然數(shù)的最大公因數(shù),即 HCF 或叫做 gcd.
    最大公約數(shù)(greatest common divisor,簡寫為gcd;或highest common factor,簡寫為hcf)
    所謂最大公因數(shù),是指幾個數(shù)的共有的因數(shù)之中最大的一個,例如 8 和 12 的最大公因數(shù)是 4,記作 gcd(8,12)=4.
    在介紹這個方法之前,先說明整除性的一些特點,注以下文的所有數(shù)都是正整數(shù),以后不再重覆.
    我們可以這樣給出整除以的定義:
    對於兩個自然數(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.因為由 a | b 可知 ha=b,所以 (hk)a=kb,即 a | kb.
    推論二:如果 a | b 以及 a | c,則 a | (b±c).因為由 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.因為由 a | b 以及 b | a,可知 ha=b,a=kb,因此 a=k(ha),hk=1,由於 h 和 k 都是正整數(shù),故 h=k=1,因此 a=b.
    輾轉相除法是用來計算兩個數(shù)的最大公因數(shù),在數(shù)值很大時尤其有用而且應用在電腦程式上也十分簡單.其理論如下:
    如果 q 和 r 是 m 除以 n 的商及余數(shù),即 m=nq+r,則 gcd(m,n)=gcd(n,r).
    證明是這樣的:
    設 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.因為 a | b 并且 b | a,所以 a=b,即 gcd(m,n)=gcd(n,r).
    例如計算 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實現(xiàn)代碼如下:

    package com;

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

        
    //逆歸實現(xiàn)
        int gcd2(int a,int b)
        
    {
            
    //直到滿足此條件逆歸退出
            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 々上善若水々 閱讀(8237) 評論(1)  編輯  收藏 所屬分類: 數(shù)據(jù)結構與算法

    評論

    # re: 輾轉相除法原理及Java實現(xiàn)  回復  更多評論   

    謝謝你的原理解釋和程序,很好。
    不過實現(xiàn)程序還缺少一些對輸入數(shù)據(jù)的限制哦,如b=0等。
    2008-11-06 23:24 | 一笑而過
    主站蜘蛛池模板: 亚洲视频在线免费播放| 131美女爱做免费毛片| 久草免费在线观看视频| 黑人大战亚洲人精品一区| jiz zz在亚洲| 黄色免费网站网址| 亚洲爆乳无码专区www| 久久WWW免费人成人片| 亚洲电影在线播放| 91黑丝国产线观看免费| 久久亚洲欧美国产精品| 国产精品免费播放| 国产成人+综合亚洲+天堂| 日韩在线看片免费人成视频播放| 亚洲另类自拍丝袜第1页| 可以免费看黄的网站| 99999久久久久久亚洲| 巨胸喷奶水视频www网免费| 中文字幕无码亚洲欧洲日韩| 亚洲欧洲久久久精品| 中文在线免费观看| 在线观看亚洲精品福利片| 日韩版码免费福利视频| 国产一级黄片儿免费看| 亚洲精品成a人在线观看夫| 亚洲AV无码久久| 97公开免费视频| 亚洲一区二区三区在线| 免费鲁丝片一级在线观看| 亚洲AV成人无码网站| 久久夜色精品国产噜噜亚洲AV| 波多野结衣免费在线观看| eeuss免费影院| 亚洲电影一区二区| 青娱分类视频精品免费2| 久久久久久久国产免费看| 蜜芽亚洲av无码精品色午夜| 亚洲国产综合无码一区二区二三区| 无码少妇一区二区浪潮免费| 久久精品亚洲日本波多野结衣| 国产亚洲欧洲Aⅴ综合一区|