最大公约数
关于求最大公约数和最小公倍数,最简单的也就是穷举法了。不过穷举法效率低下,大家基本也都会,就不做介绍了。这里介绍另外两种比较经典的算法:辗转相除法和更相减损法。
1.辗转相除法
①有两整数a和b(假设a > b),且a % b = k ...r
②如果r == 0,则b即为最大公约数
③如果r != 0,令a = b,b = r,重复①
相关证明可参考百度百科,上面写的很详细。
代码如下:
#include<stdio.h>
int main(){
int a, b, r;
scanf("%d%d", &a, &b);
//辗转相除法
while(b != 0){
r = a % b;
a = b;
b = r;
}
printf("%d", a);
return 0;
}
另外这里提供一种递归的算法,很简洁:
//辗转相除法(递归)
int Gcd(int a, int b){
return b == 0 ? a : Gcd(b, a % b);
}
2.更相减损法
更相减损术出自《九章算术》,是老祖宗的智慧。原文为:可半者半之,不可半者,副置分母、子之数,以少减多,更相减损,求其等也。以等数约之。(白话文翻译可搜索百度百科)
这里为简洁起见,就不再“半之”了。算法如下:
①有两整数a和b,如果a > b,a = a - b
②如果b > a,b = b - a
③如果a == b, 则a(或b)即为最大公约数
④如果a != b, 则回到第一步
代码如下:
#include<stdio.h>
int main(){
int a, b;
scanf("%d%d", &a, &b);
//更相减损法
while(a != b){
if(a > b) a = a - b;
else b = b - a;
}
printf("%d", a);
return 0;
}
最小公倍数
这里提出一个简单的公式法:LCM = a * b / GCD。即最小公倍数等于两数乘积除以最大公约数。