简单的求两个数的最小公倍数(另外一种思路)| Easy for find the least common multiple of two numbers (another way of thinking)

最小公倍数

题目描述

给定两个正整数 a,ba,b,求最小公倍数(lcm)。这两个整数均在 int 范围内。

输入格式

两个整数 aabb,用空格分隔。

输出格式

两个整数表示答案,用空格隔开。

样例

样例输入

1
6 15

样例输出

1
30

思路

对于两个数,求其最小公倍数时,我们可以由性质,最小公倍数和最大公约数与两个数的关系求得(小的数*大的数=最小公倍数*最大公约数)。这里提供Eli了另外一种思路,除了穷举法外的另外一种思路。分三种情况:

  1. 大的数能直接被小的数整除,则大的数就是最小公倍数。
  2. 如果两个数同时满足被个位的2、3、5、7、9其中一个数整除,那么大的数在它的某个倍数时一定能被小数整除,而且这个大的数的倍数就是最小公倍数。例如8和12能够被2整除,有12*2/8=3,故最小公倍数为12*2。
  3. 如果两个数不能满足(2)能被整除的条件,则最小公倍数是两个数的乘积。

算法思路

算法实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <stdio.h>

long int l_c_multiple(long int a, long int b) {
int more, little;
more = little = 0;
if (a > b && a % b == 0) return a;
else if (a < b && b % a == 0) return b;
else if (((a % 2 == 0) && (b % 2 == 0)) || ((a % 3 == 0) && (b % 3 == 0)) || ((a % 5 == 0) && (b % 5 == 0)) || ((a % 7 == 0) && (b % 7 == 0)) || ((a % 9 == 0) && (b % 9 == 0))) {
if (a > b) {
more = a;
little = b;
} else {
more = b;
little = a;
}
for (int i = 2; i < 10000; i++) {
if (more * i % little == 0) break;
}
return more * i;

}
else return a * b;

}

int main(void) {
long int a, b;
printf("请输入两个正整数\n");
scanf("%ld %ld", &a, &b);
printf("最小公倍数:%ld\n", l_c_multiple(a, b));
return 0;
}

不足

这个代码过于冗余,很多地方需要优化。总结下来,用性质解决和用此方法解决的时间复杂度都为O(n),但用性质解决代码量更少更简单。欢迎朋友们在评论区批评指正,谢谢!!!


感谢您的支持 | Thank you for supporting

简单的求两个数的最小公倍数(另外一种思路)| Easy for find the least common multiple of two numbers (another way of thinking)
http://example.com/2024/05/08/least-common-multiple/
作者
Eli Bi
发布于
2024年5月8日
更新于
2024年5月9日
许可协议