古人有两种求最大公约数的方法
最小公倍数 = (a * b) / 最大公约数
1.辗转相除(欧几里得-《几何原本》)
我认为辗转相除的的稳定性要强过更相减损,因为减法在数差距较大时效率会较低。
辗转相除注意考虑0的问题,0作为除数会出错。
假如需要求 1997 和 615 两个正整数的最大公约数,用欧几里得算法,是这样进行的:
1997 ÷ 615 = 3 (余 152)
615 ÷ 152 = 4(余7)
152 ÷ 7 = 21(余5)
7 ÷ 5 = 1 (余2)
5 ÷ 2 = 2 (余1)
2 ÷ 1 = 2 (余0)
至此,最大公约数为1
int main()
{
int a, b;
scanf("%d%d", &a, &b);
int muti, div;
//暂存积求最小公倍
muti = a * b;
//避免出现小除大提前进行交换,保证a>=b
if (a < b)
{
a ^= b;
b ^= a;
a ^= b;
}
//防止除数是0
if(b==0)
{
muti = 0;
div = 0;
return 0;
}
//辗转相除
while (1)
{
a = a % b;
if (!a) { div = b; break; }
b = b % a;
if (!b) { div = a; break; }
}
muti = muti / div ;
printf("%d %d", div, muti);
return 0;
}
2.更相减损(孙子-《孙子算经》)
原理相似,不再给出代码参考
解:由于63不是偶数,把98和63以大数减小数,并辗转相减:
98-63=35
63-35=28
35-28=7
28-7=21
21-7=14
14-7=7
所以,98和63的最大公约数等于7。