欧几里德原理
a,b为两个正整数,记gcd(a, b)表示a和b的最大公因数(a>b),则必然有:gcd(a, b) = gcd(b, a%b),其中a%b不为0
证明如下:
1.a可以表示为a = k*b+r,即r = a%b = a-k*b
2.记d = gcd(a, b),即有:a%d = 0且b%d = 0
3.根据步骤2,必然有:r%d = (a-k*b)%d = a%d - k*(b%d) = 0 - k*0 = 0,即d是r的因数,因此gcd(a, b) = gcd(b, r) = gcd(b, a%b)
辗转相除法
代码如下:
int gcd(int a, int b){
assert(a != 0);
assert(b != 0);
if(a < b){ //保证a>b
a ^= b;
b ^= a;
a ^= b;
}
int r;
while(abs(b) != 0){ //abs保证当输入为负数时能正确计算
r = a%b;
a = b;
b = r;
}
return abs(a);
}