最小公倍数简称 LCM,指两个整数公共倍数里面最小的那一个,C 语言求最小公倍数最常用高效算法是辗转相除法先求最大公约数 GCD,再套用公式 最小公倍数 = 两数乘积 / 最大公约数。这个题目是循环章节经典考题,相比暴力枚举法,辗转相除法运算速度更快,代码简洁,是课程作业优先推荐写法。整体执行思路是输入两个正整数,用欧几里得辗转相除求出最大公约数,代入公式计算最小公倍数,最后输出结果。
一 核心公式
LCM (a,b) = a b / GCD (a,b)
注意事项
1 计算的时候如果 a 和 b 数值很大,ab 有可能溢出,可以写成 a / GCD (a,b) b,降低溢出风险
2 输入数字必须是正整数,0 不参与最小公倍数计算
3 辗转相除原理 不断取余数,直到余数等于 0,最后的除数就是最大公约数
二 完整代码 辗转相除法版本
include
//求最大公约数
int gcd(int a, int b)
{
int temp;
while(b != 0)
{
temp = a % b;
a = b;
b = temp;
}
return a;
}
int main()
{
int a,b;
int g;
int lcm;
printf("请输入两个正整数:");
scanf("%d%d",&a,&b);
g = gcd(a,b);
lcm = a / g b;
printf("最大公约数是%d\n",g);
printf("最小公倍数是%d\n",lcm);
return 0;
}
三 代码逐段分析
gcd 函数
while 循环条件是 b 不等于 0
temp 保存 a 对 b 取余的结果
然后把 b 赋值给 a,余数 temp 赋值给 b
循环结束的时候 a 就是最大公约数
main 函数
scanf 读取两个正整数 a 和 b
调用 gcd 函数得到最大公约数 g
lcm = a /g b 计算最小公倍数,这种写法优先做除法,减少整数乘积溢出
最后打印最大公约数和最小公倍数
测试示例
输入 12 和 18
最大公约数是 6
最小公倍数 = 12 / 6 18 = 36
四 拓展版本 暴力枚举法 适合初学理解
思路 从较大那个数字开始往上遍历,找到第一个可以同时整除 a 和 b 的数字,就是最小公倍数
include
int main()
{
int a,b,i;
scanf("%d%d",&a,&b);
int max = a > b ? a : b;
for(i = max; ; i++)
{
if(i % a == 0 && i % b == 0)
{
printf("最小公倍数%d",i);
break;
}
}
return 0;
}
特点 逻辑容易看懂,但是数字很大的时候循环次数多,效率低于辗转相除法
五 易错点清单
1 直接写 ab/gcd,大数相乘溢出,推荐改成 a/gcdb
2 忘记考虑负数输入,题目默认正整数
3 混淆最大公约数和最小公倍数公式
4 辗转相除循环终止条件写错,不是 a 不等于 0,是余数 b 等于 0
5 变量没有初始化,输出随机垃圾值
【常见问题】
问题 1 c 语言求最小公倍数为什么要先求最大公约数
回答 1 c 语言求最小公倍数有固定数学公式,最小公倍数等于两数乘积除以最大公约数,所以 c 语言求最小公倍数标准写法都是先用辗转相除法求 GCD 再代入公式。
问题 2 c 语言求最小公倍数 ab 容易溢出怎么办
回答 1 c 语言求最小公倍数的时候,改成 a /gcd b,先做除法再乘法,这样可以避免 a 和 b 相乘之后数值超过 int 上限,是 c 语言求最小公倍数优化写法。
问题 3 c 语言求最小公倍数暴力法和辗转相除法选哪个
回答 1 c 语言求最小公倍数课程作业优先选辗转相除法,代码短运行快,暴力枚举法适合理解原理,数字很大的时候效率差,是 c 语言求最小公倍数两种主流实现。
问题 4 c 语言求最小公倍数如果是三个数字怎么算
回答 1 c 语言求最小公倍数如果是三个数,可以分步计算,先求前两个数最小公倍数,再把这个结果和第三个数继续求最小公倍数,是 c 语言求最小公倍数多数字拓展思路。
【免责申明】
本文代码为课程作业参考实现,默认使用 int 类型,如果题目数值范围很大,请修改成 long long 类型并且把输出格式改为 % lld,代码仅用于学习参考。


