-
gcd(a,b)最大公约数(greatest common divisor)
欧几里得算法又称辗转相除法,是指用于计算两个非负整数a,b的最大公约数。应用领域有数学和计算机两个方面。计算公式gcd(a,b) = gcd(b,a mod b)。
#include<stdio.h>
int gcd(int a, int b) {
int temp;
if (a < b) {
temp = a;
a = b;
b = temp;
}
int r = a % b;
while (r != 0) {
a = b;
b = r;
r = a % b;
}
return b;
}int main() {
int a, b;
scanf("%d %d", &a, &b);
printf("%d", gcd(a, b));
return 0;
}
原理:r=a mod b,求gcd(a,b)即求gcd(b,r).
证明:不妨设a>b,由整数拆分定理:
a=kb+r
假设,d是a和b的任意一个公约数
即:a mod d = 0;
b mod d = 0;
r mod d = (a-kb) mod d = 0;
所以d也是b和a(mod)b的一个公约数;
所以任意一个a和b的公约数都是b和a(mod)b的公约数;
同理可证任意一个b和a(mod)b的公约数都是α和b的公约数;
所以a和b的公约数组成的集合和b和a(mod)b的公约数组成的集合完全相同,
所以a和b的最大公约数一定也和b和a(mod)b的最大公约数相等。
所以当a(mod)b等于0时,b和0的最大公约数显然等于b,然后往前面返回,就有a和b的最大公约数等于某轮循环时a(mod)b等于0时,此轮b的值。
-
lcm(a,b) 最小公倍数(lowest common multiple)
lcm(a, b) = a * b / gcd(a, b);