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;
}

两种方法相比,辗转相除法的代码效率更高,所以更推荐使用辗转相除法。

最后附上程序运行的结果:输入6和16


猜你喜欢

转载自blog.csdn.net/lcy6239/article/details/79691621