椋鸟C语言笔记#9:辗转相除法与更相减损法求公约数

萌新的学习笔记,写错了恳请斧正。


目录

辗转相除法求最大公约数

计算方式

实现

更相减损法求最大公约数

计算方式

实现


辗转相除法求最大公约数

辗转相除法,又称欧几里得算法(Euclidean algorithm),是求取最大公约数的一种算法。辗转相除法首次出现于欧几里得的《几何原本》中的第Ⅶ卷,书中的命题ⅰ和命题ⅱ所描述的就是辗转相除法,而在中国,辗转相除法最早出现在《九章算法》中。

其原理为:两个数的最大公约数等于其中较小的数字和二者之间余数的最大公约数

计算方式

要求a、b两数的最大公约数,先将其中较大的数除以较小的数,得到的余数再与除数比较大小。随后再用较大的数除以较小的数,得到的余数依旧与本次的除数比大小……直到某次的余数为0,此时的除数即为最大公约数。

实现
int CommonDivisor(int a, int b)
{
	int c = 0;

	do
	{
		c = a % b;
		a = b;
		b = c;
	} while (c != 0);

	return a;
}

更相减损法求最大公约数

在《九章算术》里记载了更相减损法这种求最大公约数的算法,它原本是为约分而设计的,但它适用于任何需要求最大公约数的场合。

计算方式

要求a、b两数的最大公约数,先把公约数2提干净(同时除2直到不都是偶数)。然后用较大的数减去较小的数。再将减数与差比较,继续用较大的数减去较小的数……直到减数与差相等,这个数再乘上之前约去的2(所有)就是最大公约数。

实现
int CommonDivisor(int a, int b)
{
	int c = 0;//余数
	int c2 = 0;//第一步除2的次数
	int r = 0;//交换数过渡区
	int cd = 0;//结果

	while (0 == a % 2 && 0 == b % 2)
	{
		a /= 2;
		b /= 2;
		c2++;
	}

	while (a != b)
	{
		if (a < b)
		{
			r = a;
			a = b;
			b = r;
		}

		c = a - b;
		a = b;
		b = c;
		c = 0;
	}

	cd = (int)pow(2, c2) * a;

	return cd;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

椋鸟Starling

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值