1. 求两数的最大公约数(greatest common divisor)和最小公倍数(least common multiple)
a = m * gcd(a,b), b = n * gcd(a,b) => lcm(a,b) = m * n * gcd(a,b) = a * b / gcd(a,b)
求最大公约数的常见方法有欧几里得法(辗转相除法)和最简单的循环找最大除数法
1) 欧几里得法:利用 m、n和n、(m % n)之间的最大公约数相同的原理,通过方法,在m%n=0的时候得到最大公约数.
证明:假设m>n, 令m = k*n + r, 若最大公约数为p, 则p|m, p|n, r = m-k*n,所以p|r,得证.
实例:求481 221的最大公约/因数
------解:481 = 221*2 + 39, 221 = 39*5 + 26, 39 = 26*1 + 13, 26 = 13*2 + 0; 可知最大公因数 = 13
//递归法
int getGCD(int m, int n) {
if (m < n) { //保证m>n,如果m<n则进行数据交换
int temp = m;
m = n;
n = temp;
}
if (m % n == 0)
return n;
else
return getGCD(n, m % n);
}
2) 循环法求最大公约数
a)
int getGCD(int m, int n) {
if (m < n) { //保证m>n,如果m<n则进行数据交换
int temp = m;
m = n;
n = temp;
}
while (m % n != 0) {
int temp = m % n;
m = n;
n = temp;
}
return n;
}
b)
int getGCD(int m, int n) { //这种方法有个弊端,如果其中一个数大于32位的话,运算就会非常耗时
if (m < n) { //保证m>n,如果m<n则进行数据交换
int temp = m;
m = n;
n = temp;
}
int gcd = 1;
for (int i = n; i > 0; i --) {
if (n%i == 0 && m%i == 0) {
gcd = i; break;
}
}
return gcd;
}