• 最大公因數


    寫一個程式,輸入兩個正整數 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。

     

  • 相关阅读:
    A4988和CNC SHIELD使用方法 步进电机
    MTP 写字机器
    s*s*r备用
    VHDL 例程
    ESP8266 使用
    世界四大航海家
    第六周学习进度总结
    关于tensorflow版本报错问题的解决办法
    第五周学习进度总结
    机器学习对文本的聚类KMeans
  • 原文地址:https://www.cnblogs.com/liwenbin/p/2579267.html
Copyright © 2020-2023  润新知