C语言求最小公倍数的3种方法

方法一:累加试除法

两个数的最小公倍数一定大于或等于这两个数中的较大值,根据这一规律,我们可以直接从这两个数中的较大数开始,依次加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;
}

  • 11
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值