【算法总结】最大公约数和最小公倍数
一、最大公约数(GCD:greatest common divisor)
欧几里得算法:
若 a、b 全为零则它们的最大公约数不存在;若 a、b 其中之一为零,则它们的最大公约数为 a、b 中非零的那个;若 a、b都不为零,则使新 a = b;新 b = a % b,然后重复该过程。
例4.4 最大公约数
递归代码
#include<cstdio> int gcd(int a, int b) { if (b == 0)return a;//若b为零则最大公约数为a else return gcd(b, a%b);//否则改为求b和a%b的最大公约数 } int main() { int a, b; while (scanf("%d%d", &a, &b) != EOF)printf("%d ", gcd(a, b)); return 0; }
非递归代码
#include<cstdio> int gcd(int a, int b) { while (b != 0) { int t = a % b; a = b; b = t; } return a; } int main() { int a, b; while (scanf("%d%d", &a, &b) != EOF)printf("%d ", gcd(a, b)); return 0; }
二、最小公倍数(LCM:lowest common multiple)
a、b 两数的最小公倍数为两数的乘积除以它们的最大公约数。
例4.5 最小公倍数
时间限制:1 秒 内存限制:128 兆
题目描述
给定两个正整数,计算这两个数的最小公倍数
输入
输入包含多组测试数据,每组只有一行,包括两个不大于 1000 的正整数。
输出
对于每个测试用例,给出这两个数的最小公倍数,每个实例输出一行。
样例输入
10 14
样例输出
70
解题代码
#include<cstdio> 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 ", a*b / gcd(a, b));//求最小公倍数 return 0; }