题目
求两个正整数的最小公倍数
思路
本题求两个正整数的最小公倍数 LCM。
先写求 GCD 的函数或代码段,再算 lcm = a / gcd * b(先除 GCD 再乘,比先乘 a*b 更不易溢出);结果很大时用 long long。
解题分析
lcm(a,b)=a/gcd(a,b)*b,先写 gcd 再乘,顺序上先除 gcd 再乘 b 可减小中间值。两数很大时用 long long 存 lcm。
完整程序
#include <stdio.h>
static int gcd_int(int a, int b)
{
while (b) {
int t = a % b;
a = b;
b = t;
}
return a;
}
int main(void)
{
int a, b;
if (scanf("%d %d", &a, &b) != 2) {
return 1;
}
int g = gcd_int(a, b);
long long lcm = (long long)a / g * b;
printf("%lld\n", lcm);
return 0;
}
运行示例
输入:
4 6输出:
12其它写法
下面每种写法都是完整程序,输入输出格式与正文一致,便于对照。
用定义枚举 lcm
从较大数开始每次加 max(a,b),能同时整除即 lcm,仅适合小数据。
程序:
#include <stdio.h>
int main(void)
{
int a, b;
if (scanf("%d %d", &a, &b) != 2) {
return 1;
}
int m = a > b ? a : b;
int step = m;
while (m % a != 0 || m % b != 0) {
m += step;
}
printf("%d\n", m);
return 0;
}运行示例
输入:
4 6输出:
12