zoukankan      html  css  js  c++  java
  • 最大公因數

    寫一個程式,輸入兩個正整數 A、B,印出它們的最大公因數。例如:

    輸入1:96 40

    輸出1:8

    輸入2:120 160

    輸出2:40

    首先我們先用最簡單的方法,也就是從 A、B 兩數比較小的那個數開始,每次遞減一,直到一為止,一一測試是否可以同時將 A、B 整除,如果可以,則找到最大公因數,並不用再往下測試了。程式如下:

    int a, b, c, i;
    cin >> a >> b;
    if(a>b) c=b;
    else c=a;
    for (i=c; i>=1; i--) {
      if ( (a%i==0) && (b%i==0) ) break;
    }
    cout << i << endl;

    以上的方法,雖然不是最有效率的,卻是最簡單的。像這種一個一個試,不太使用大腦的方法,我們稱之為「暴力法」。

    接下來我們看到比較有效率一點的方法,也就是利用數學裡的輾轉相除法來求它們的最大公因數。輾轉相除法的原理是,如果 A 除以 B 的餘數為 C,則 A、B 的最大公因數和 B、C 的最大公因數是相同的,而如果 B 除以 C 的餘數為 D,則 B、C 的最大公因數等於 C、D 的最大公因數。如此反覆下去,直到餘數為 0,則最後那一個不為 0 的餘數則為 A、B 的最大公因數。

    首先,我們先輸入兩個數,然後如果 B 大於 A,則先將兩個數對調,程式如下:

    int a, b, c;
    cin >> a >> b;
    if(a<b) {
      c=b;
      b=a;
      a=c;
    }

    上面的程式中,我們利用變數 c 來當暫存變數,讓 a、b 兩個變數的值可以對調。接下來,我們反覆執行下面的動作:

    while( b!=0 ) {
      c=a%b;
      a=b;
      b=c;
    }

    上面的程式,我們先取 a 除以 b 的餘數並把它存到 c,因為 a、b 的最大公因數和 b、c 的最大公因數一樣,所以把 b 的值給 a,再把 c 的值給 b,如此反覆下去,直到 b 變成 0 為止,則這時的 a 就是我們要求的最大公因數。這時 b!=0 的條件不再成立,於是跳出這個迴圈。最後,我們再把結果印出來:

    cout << a << endl;

    下面我們以 96、40 為例,把執行過程中每一次迴圈的變化列出來:

    次數abc
    09640?
    1401616
    21688
    3800

    由上表可以得知,第三次迴圈執行完, b 即為 0,於是結束該迴圈,這時最大公因數即為 8。

     

  • 相关阅读:
    yzoj P2344 斯卡布罗集市 题解
    yzoj P2350 逃离洞穴 题解
    yzoj P2349 取数 题解
    JXOI 2017 颜色 题解
    NOIP 2009 最优贸易 题解
    CH 4302 Interval GCD 题解
    CH4301 Can you answer on these queries III 题解
    Luogu2533[AHOI2012]信号塔
    Luogu3320[SDOI2015]寻宝游戏
    Luogu3187[HNOI2007]最小矩形覆盖
  • 原文地址:https://www.cnblogs.com/liwenbin/p/2579267.html
Copyright © 2011-2022 走看看