古人有两种求最大公约数的方法
最小公倍数 = (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。