辗转相除法求最大公约数·原理推导·代码(C++)

——算法原理——

·两个整数的最大公约数等于其中较小的数或两数相除余数的最大公约数

——算法过程——

求a、b(a>=b)的最大公约数

1、a%b=c

2、 b%c=d

3、 c%d=e

         ···

当最终取余结果为零时,最后的余数就为最大公约数

——证明——

(下文用gcd(a,b)表示最大公约数)

a,b为正整数

假设gcd(a,b) = c,1 <= b <= a,

则a = m * c,b = n * c;

因为a >= b,所以m * c >= n * c

又因为a = k * b + r (r为余数),那么r = a - k * b = m * c + k * n * c = (m + k * n) * c,也就是说 c 也是余数 r 的约数

则 c 为 a、b、r 的约数

同理,在算法过程中产生的余数都能被 c 整除

在算法过程中产生的余数会不断减小,同时 c 又是它们的约数,所以总会出现等于 c 的余数,以算式等于 0 为标志。

——代码实现——

 源代码:

#include<iostream>
using namespace std;
int gcd(int a, int b)
{
	int outcome = a % b == 0 ? b : gcd(b, a % b);
	return outcome;
}

int main()
{
	int t = 0;
	cin >> t;
	for (int i = 0; i < t; i++)
	{
		int a = 0, b = 0;
		cin >> a >> b;
		cout << "最大公约数为" << gcd(a, b) << endl;;
	}		
	return 0;
}

 运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值