用C語言實現:求兩數的最大公約數。


求兩數最大公約數的方法有很多,這里重點介紹這兩種算法:

輾轉相除法 和 更相減損法。

1、輾轉相除法。

在兩個數中,找出大數,用大數除以小數,得到整數商和余數,然后再不斷地用除數(原來的小數)除以余數,直到沒有余數為止。

那么除數即為最大公約數。

所以我們可以用一個循環來進行被除數、除數和余數之間的位置互換。

也可以用goto語句來進行循環操作。

要注意的是,goto語句在一個程序當中最好不要多次出現,否則程序很有可能混亂。

這里給出一個利用goto語句完成的程序代碼:

#include<stdio.h>
int main()
{
    int a = 6, b = 16,t;
    if (a < b)
    {
        t = a;
        a = b;
        b = t;
    }
flag:
    if (a%b == 0)
    {
        printf("%d\n", b);
    }
    else
    {
        t = a;
        a = b;
        b = t%b;
        goto flag;
    }
    system("pause");
    return 0;
}

PS:如果用循環來做的時候,我們需要將flag~goto語句中間的部分作為循環體。

2、更相減損法。

這個算法原出自於《九章算術》中,將算法內容用現代漢語翻譯后為:

第一步:任意給定兩個正整數;判斷它們是否都是偶數。若是,則用2約簡;若不是則執行第二步。
第二步:以較大的數減較小的數,接着把所得的差與較小的數比較,並以大數減小數。繼續這個操作,直到所得的減數和差相等為止。
則第一步中約掉的若干個2與第二步中等數的乘積就是所求的最大公約數。
代碼如下:
#include<stdio.h>
#include<math.h>
int main()
{
    int i = 0, t, x, a = 6, b = 16, result;
    while ((a % 2 == 0) && (b % 2 == 0))
    {
        a /= 2;
        b /= 2;
        i += 1;
    }
    if (a < b)
    {
        t = a;
        a = b;
        b = t;
    }
    do
    {
        x = a - b;
        if (b == x)
            break;
        a = (b > x) ? b : x;
        b = (b < x) ? b : x;
    } while (x);
    if (i == 0)
    {
        result = b;
        printf("%d\n", result);
    }
    else
    {
        result = (int)pow(2, i)*b;
        printf("%d\n", result);
    }
    system("pause");
    return 0;
}

兩種方法相比,輾轉相除法的代碼效率更高,所以更推薦使用輾轉相除法。
最后附上程序運行的結果:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM