最大公約數(shù)GCD的三種求法

最大公約數(shù)(GCD, Greatest Common Divisor,為簡便下文都使用GCD表示最大公約數(shù)):指某幾個整數(shù)共有約數(shù)中最大的一個懂傀。

由于多個數(shù)的GCD可以拆分成兩個數(shù)的GCD芬骄,所以一般來說常見的是求兩個數(shù)的GCD翠忠。廢話不多說狠半,來看看目前我已知的求GCD的方法可缚。

  • 窮舉法
  • 輾轉(zhuǎn)相除法
  • 輾轉(zhuǎn)相減法

下面來一個一個看穴墅。約定待求GCD的數(shù)為a, b惶室。

1. 窮舉法

這是最容易想到,而且是最直接的方法玄货。簡言之皇钞,就是從1開始,到a,b中比較小的那個結(jié)束松捉,看能不能同時被a, b整除(如果能即為公約數(shù))夹界,這樣一個循環(huán)下來一定可以找出GCD。

代碼如下:

    // 窮舉法
    public static int gcd_enumeration(int a, int b){
        // 先找出a,b中小的那個
        int smaller = a;
        if (b < a) {
            smaller = b;
        }

        int gcd = 1;
        for (int i = 2; i <= smaller; i++) {
            // 如果能同時被a和b除盡隘世,則更新GCD
            if ((a % i == 0) && (b % i == 0)) {
                gcd = i;
            }
        }
        return gcd;
    }

2. 輾轉(zhuǎn)相除法

輾轉(zhuǎn)相除法又稱為歐幾里得算法可柿,大概公元前300年歐幾里得老大爺就想出來這么個算法了,厲害了丙者!

該方法依托于一個定理:

gcd(a, b) = gcd(b, a mod b)

其中复斥,a mod b是a除以b所得的余數(shù)。

啥意思呢械媒,就是說a,b的最大公約數(shù)就是b,a mod b的最大公約數(shù)目锭。

證明如下:

(1)充分性:
設(shè)g是a,b的公約數(shù),則a,b可由g來表示:
a = xg, b = yg (x,y為整數(shù))
又纷捞,a可由b表示(任意一個數(shù)都可以由另一個數(shù)來表示):
a = kb + r (k為整數(shù)痢虹,r為a除以b所得余數(shù))
=> r = a - kb = xg - kyg = (x - ky)g
即,g也是r的約數(shù)主儡。
這樣奖唯,g就是(b, r)即(b, a mod b)的公約數(shù)。

(2)必要性:
設(shè)g是(b, a mod b)的公約數(shù)缀辩,類似于(1)臭埋,同樣可以推出g也是(a, b)的公約數(shù)踪央。

綜合(1)(2)可得(a, b)和(b, a mod b)的公約數(shù)是一樣的,當(dāng)然最大公約數(shù)也是一樣的瓢阴。

好了畅蹂,有了理論基礎(chǔ),下面總結(jié)成算法步驟:

  1. a % b得余數(shù)r
  2. 若r == 0荣恐,則b即為GCD
  3. 若r != 0液斜,則a = b, b = r,返回步驟1

代碼如下

    // 輾轉(zhuǎn)相除法(遞歸寫法)
    public static int gcd_division_recursive(int a, int b){
        if (b == 0) {
            return a;
        }
        return gcd_division_recursive(b, a % b);
    }

    // 輾轉(zhuǎn)相除法(迭代寫法)
    public static int gcd_division_iteration(int a, int b){
        while(b != 0){// 為什么用b判斷呢叠穆?因為b就是用來存a%b的少漆,即上面算法步驟里的r的
            int t = b;
            b = a % b;
            a = t;
        }
        return a;
    }

3. 輾轉(zhuǎn)相減法

這個方法出處目前我也不知道,而且證明過程我也不知道硼被,先寫在這里示损,過后待我研究研究。

算法步驟:

  1. 若a > b嚷硫,則a = a - b
  2. 若b > a检访,則b = b - a
  3. 若a == b,則a(或b)即為最大公約數(shù)
  4. 若a != b仔掸,則回到1

既然沒有證明脆贵,那就舉個栗子瞧瞧看吧。

求32,12的最大公約數(shù):
32 - 12 = 20 (20 > 12)
20 - 12 = 8 (8 < 12)
12 - 8 = 4 (4 < 8)
8 - 4 = 4 (4 == 4)
所以最大公約數(shù)是4.

代碼如下:

    // 輾轉(zhuǎn)相減法(遞歸寫法)
    public static int gcd_substract_recursive(int a, int b){
        if(a == b)
            return a;
        return a > b ? gcd_substract_recursive(a - b, b) : gcd_substract_recursive(a, b - a);
    }

    // 輾轉(zhuǎn)相減法(迭代寫法)
    public static int gcd_substract_iteration(int a, int b){
        // 如果a,b不相等起暮,則用大的數(shù)減去小的數(shù)卖氨,直到相等為止
        while(a != b){
            if(a > b)
                a = a - b;
            else
                b = b - a;
        }
        return a;
    }

以上,我們知道了怎么求兩個數(shù)的最大公約數(shù)负懦,那最小公倍數(shù)呢筒捺?

其實,只要知道了a,b的最大公約數(shù)密似,那最小公倍數(shù)不就是a * b / gcd(a, b)嗎焙矛?

完整代碼

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市残腌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌贫导,老刑警劉巖抛猫,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異孩灯,居然都是意外死亡闺金,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進(jìn)店門峰档,熙熙樓的掌柜王于貴愁眉苦臉地迎上來败匹,“玉大人寨昙,你說我怎么就攤上這事∠颇叮” “怎么了舔哪?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長槽棍。 經(jīng)常有香客問我捉蚤,道長,這世上最難降的妖魔是什么炼七? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任缆巧,我火速辦了婚禮,結(jié)果婚禮上豌拙,老公的妹妹穿的比我還像新娘陕悬。我一直安慰自己,他們只是感情好按傅,可當(dāng)我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布墩莫。 她就那樣靜靜地躺著,像睡著了一般逞敷。 火紅的嫁衣襯著肌膚如雪狂秦。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天推捐,我揣著相機(jī)與錄音裂问,去河邊找鬼。 笑死牛柒,一個胖子當(dāng)著我的面吹牛堪簿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播皮壁,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼椭更,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蛾魄?” 一聲冷哼從身側(cè)響起虑瀑,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎滴须,沒想到半個月后舌狗,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡扔水,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年痛侍,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片魔市。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡主届,死狀恐怖赵哲,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情君丁,我是刑警寧澤枫夺,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站谈截,受9級特大地震影響筷屡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜簸喂,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一毙死、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧喻鳄,春花似錦扼倘、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至颜曾,卻和暖如春纠拔,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背泛豪。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工稠诲, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人诡曙。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓臀叙,卻偏偏與公主長得像,于是被迫代替她去往敵國和親价卤。 傳聞我的和親對象是個殘疾皇子劝萤,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容