方法一:累加试除法
两个数的最小公倍数一定大于或等于这两个数中的较大值,根据这一规律,我们可以直接从这两个数中的较大数开始,依次加1,加1得到的结果拿来试除这两个数,直到能同时被这两个数整除。
例如,求 2 和 3 的最小公倍数。3较大,引入一个变量num,num>=3,从num = 3开始,num % 2 != 0,所以num++,变为4, 4 % 3 != 0,继续执行num++,变为5, 5 % 2 != 0,num++,变为6, 6 % 2 = 0,
6 % 3 = 0。所以2 和 3 的最小公倍数为6。这种方法显然效率较低。
请看代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int a = 0;
int b = 0;
printf("请输入两个整数:");
scanf("%d%d", &a, &b);
int max = a > b ? a : b;//条件运算符,a>b成立,则表达式的值为a,否则,为b
while (max % a != 0 || max % b != 0)
{
max++;
}
printf("最小公倍数为:%d", max);
return 0;
}
方法二:倍数试除法
对于两个正整数a和b,它们的最小公倍数一定既是a的倍数又是b的倍数(这句话是废话),因此根据这一特性,我们可以从a的倍数着手,用a的倍数去试除b,直到能被b整除,当然也可以从b的倍数入手,这种方法不同于方法一,不需要比较大小,而且过滤掉了很多没必要试除的数,也就是过滤掉了既不能被a整除又不能被b整除的数,因为这些数更加不可能是它们的最小公倍数,因次,效率也相对较高。当然此种方法也也可以从较大的数的倍数入手,但这里就不赘述。
请看代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int a = 0;
int b = 0;
printf("请输入两个整数:");
scanf("%d%d", &a, &b);
int i = 1;
while ((a * i) % b)//整除时,结果为0(假),不进入循环
{
i++;
}
printf("最小公倍数为:%d", a * i);
return 0;
}
方法三:利用最大公约数求最小公倍数
如果不知道怎么求最小公倍数,可以点开这个链接查看:求两个整数的最大公约数-CSDN博客。在数学里,有这样一个性质:两个数的乘积等于这两个数的最大公约数与最小公倍数的乘积。假设最大公约数为gcd, 最小公倍数为m,这两个数为a,b,那么根据这一性质,有 a * b = gcd * m, gcd可求,a * b已知,推出 m = (a * b)/ gcd。
请看代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int a = 0;
int b = 0;
int remainder = 0;//余数
printf("请输入两个整数:");
scanf("%d%d", &a, &b);
int i = a;
int j = b;//因为在求a和b的值会被改变,所以需要储存起来
while (b)
{
remainder = a % b;
a = b;
b = remainder;
}
printf("最小公倍数为:%d", (i * j) / a);
return 0;
}