首页 >> 百科知识 > 甄选问答 >

问C 语言求最小公倍数 辗转相除法实现详解

2026-11-05 08:42:07

答

最小公倍数简称 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,代码仅用于学习参考。

 

相关阅读

最新文章