欧几里德算法是最早的算法,用辗转相除法求最大公因数。
#include <iostream>
using namespace std;
//Gcd(m, n) == Gcd(n, m mod n)
//Gcd(m, 0) == m
int Gcd(int m, int n)
{
while (n != 0) {
int r = m % n;
m = n;
n = r;
}
return m;
}
证明:
令p = a / b,q = a % b.
则a = b * p + q.
对等式左右两边同除以gcd(b, q),因为gcd(b, q)能整除b和q,所以等式右边为两个整数之和。
因此a / gcd(b, q)为整数,即gcd(b, q)能整除a。
所以gcd(b, q)能整除gcd(a, b).
同理q = a - b * p,gcd(a, b)能整除a, b, q.
gcd(a, b)能整除gcd(b, q).
所以gcd(a, b) == gcd(b, q)!