输入两个整数a和b,计算并输出a和b的最大公约数。
#include <iostream>
using namespace std;
int gcd(int a, int b)
{
return a % b == 0 ? b : gcd(b, a % b);
}
int main()
{
int a, b;
cin >> a >> b;
cout << gcd(a, b);
return 0;
}
这个题目是非常经典的算法,本身没什么好说的,其证明如下:
a
=
q
b
+
r
a = qb + r
a=qb+r
如果
r
=
0
r=0
r=0,a是b的倍数,显然b是a和b的最大公因子。
如果
r
≠
0
r \neq 0
r=0,任意整除a和b的数必定整除
a
−
q
b
=
r
a-qb=r
a−qb=r ,因此整除n和r的任何数必定整除
q
b
+
r
=
a
qb+r=a
qb+r=a。
所以{a,b}的最大公因子集合和{b,r}的公因子集合是一样的。特别的,{a,b}的最大公因子和{b,r}的最大公因子是一样的。