Lowest Common Multiple Plus
#include <cstdio> int gcd(int a, int b) { if(a % b == 0) return b; else return gcd(b, a % b); } int main() { int n, a, b; while(scanf("%d", &n) != EOF) { scanf("%d", &a); n = n - 1; while(n --) { scanf("%d", &b); a = (a / gcd(a, b)) * b; // (a*b)/gcd(a, b) 有可能出现不能整除下取整的情况, 而(a/gcd(a, b))*b一定会整除 } printf("%d\n", a); } return 0; }
#include <cstdio> int gcd(int a, int b) { return b ? gcd(b, a % b) : a; } int lcm(int a, int b) { return (a / gcd(a, b)) * b; } int main() { int n, a, b; while(scanf("%d", &n) != EOF) { scanf("%d", &a); n --; while(n --) { scanf("%d", &b); a = lcm(a, b); } printf("%d\n", a); } return 0; }
最小公倍数的求解在最大公约数的基础上运行. 当得到a和b的最大公约数d之后, 可以马上得到a和b最小公倍数是ab / d.
由于ab在实际运算中可能会溢出,因此更恰当的写法是a / d * b.由于d是a的约数,所以a/d一定可以整除.(d是最大公因数)