您的位置:首页 > 编程语言 > C语言/C++

C语言实现: 求两个数的最大公约数

2018-03-25 22:28 323 查看
求两数最大公约数的方法有很多,这里重点介绍这两种算法:辗转相除法 和 更相减损法。

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: