——算法原理——
·两个整数的最大公约数等于其中较小的数或两数相除余数的最大公约数
——算法过程——
求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;
}
运行结果: