求a、b两个正整数的最大公约数,通过欧几里得算法,可以改变朴素的枚举法需要“暴力”遍历所有数字的情况,而改为利用数学原理巧妙地将问题转化为规模更小的问题,从而得出最后答案。
欧几里得算法的核心思想是把求a、b的最大公约数转换成求b、a mod b的最大公约数,不断重复该过程直到问题缩小成为某个非零数和零的最大公约数。
// 递归
#include<stdio.h>
int gcd(int a, int b) {
if (b == 0)
return a; //若b为0,则a为ab的最大公约数
else return gcd(b, a%b); //否则,改为求a与a%b的最大公约数
}
int main() {
int a, b;
while (scanf("%d%d", &a, &b)!=EOF) {
printf("%d\n", gcd(a, b));
}
return 0;
}
//非递归
#include<stdio.h>
int gcd(int a, int b) {
while (b != 0) { //只要b不为0,一直持续该过程
int t = a%b;
a = b; //a变为b
b = t; //当b为0时,a即为所求
}
return a;
}
int main() {
int a, b;
while (scanf("%d%d", &a, &b)!=EOF) {
printf("%d\n", gcd(a, b));
}
return 0;
}
最小公倍数(LCM)
#include<stdio.h>
int gcd(int a, int b) {
return b != 0 ? gcd(b, a%b) : a;
}
int main() {
int a, b;
while (scanf("%d%d", &a, &b)!=EOF) {
printf("%d\n", a*b/gcd(a, b));
}
return 0;
}