C/C++ 辗转相除与更相减损求最大公约数公倍数

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YUE ZHEN PENG

码字不易,如果你想请我喝杯果汁

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值