1:最大公约数greatest common divisor
最大公因数,也称最大公约数、最大公因子,指两个或多个整数共有约数中最大的一个。
2:求解最大公约数
2-1:辗转相除法:辗转相除法是求两个自然数的最大公约数的一种方法,也叫欧几里德算
法。
2-2:更相减损法:《九章算术》:“可半者半之,不可半者,副置分母、子之数,以少减多,更相减损,求其等也。以等数约之。”
第一步:任意给定两个正整数;判断它们是否都是偶数。若是,则用2约简;若不是则执行第二步。
第二步:以较大的数减较小的数,接着把所得的差与较小的数比较,并以大数减小数。继续这个操作,直到所得的减数和差相等为止。
则第一步中约掉的若干个2与第二步中等数的乘积就是所求的最大公约数。
其中所说的“等数”,就是最大公约数。求“等数”的办法是“更相减损”法。所以更相减损法也叫等值算法。
3:最小公倍数Least Common Multiple
两个或多个整数公有的倍数叫做它们的公倍数,其中除0以外最小的一个公倍数就叫做这几个整数的最小公倍数。整数a,b的最小公倍数记为[a,b]。
与最小公倍数相对应的概念是最大公约数,a,b的最大公约数记为(a,b)。关于最小公倍数与最大公约数,我们有这样的定理:(a,b)[a,b]=ab(a,b均为整数)
最小公倍数下一个定义:S个数的最小公倍数,为这S个数中所含素因子的最高次方之间的乘积。
代码实现:
#include <stdio.h>
#include <stdlib.h>
// greatest common divisor
int gcd_1(int a, int b) {
if (a <= 0 || b <= 0) {
return 1;
}
int res = 1;
while ( a % 2 == 0 && b % 2 == 0 ) {
res *= 2;
a = a / 2;
b = b / 2;
}
int temp = 0;
if ( a < b ) {
temp = a;
a = b;
b = temp;
}
temp = a - b;
while (temp != b){
if ( temp > b ) {
a = temp;
}
else {
a = b;
b = temp;
}
temp = a - b;
}
return temp * res;
}
// greatest common divisor
int gcd_2(int a, int b) {
if (a % b == 0) {
return b;
}
else {
return gcd_2(b, a%b);
}
}
// least common multiple
int lcm(int a, int b) {
int tmp = 1;
tmp = a * b / gcd_2(a,b);
return tmp;
}
void main() {
int a,b,c;
a = b = c = 0;
scanf("%d%d", &a, &b);
c = gcd_2(a, b);
printf("%d\n", c);
}