三个数的最小公倍数LCM (least common multiple)

问题引入——

问题描述
已知一个正整数 N,问从 1~N 中任选出三个数,他们的最小公倍数最大可以为多少。
输入格式
输入一个正整数 N。
输出格式
输出一个整数,表示你找到的最小公倍数。
样例输入
9
样例输出
504
数据规模与约定
1 <= N <= 106。



必备知识:三个连续自然数,如果有两个是奇数,则这三个数的积就是它们的最小公倍数。

证明过程可以参考一道题目——

求:三个连续自然数的积与它们最小公倍数的关系

解:

三个连续自然数,如果是两个奇数一个偶数,那么三个连续自然数的积是三个连续自然数的最小公倍数;

如果是两个偶数一个奇数,那么三个连续自然数的积是三个连续自然数的最小公倍数的2倍

1、两个连续的自然数是互质数。(可以用反证法进行证明:假设两个连续的自然数n和n+1不是互质数,设它们有公因数q(q≠1),那么必存在非0自然数p1和p2,使得n=p1×q;n+1=p2×q,两式相减得n+1-n= p2×q- p1×q,即:(p2-p1)q=1,由于q≠1,所以p2-p1=1/q为分数,这与p2、p1为整数矛盾。)

2、两个连续的偶数只有公因数1和2。(假设两个连续的偶数为2n与2n+2,由于2n÷2=n, (2n+2) ÷2=n+1, n 与n+1是连续的自然数一定是互质的,所以2n与2n+2公因数只有1和2。)

3、两个连续的奇数公因数只有1,是互质数。(假设两个连续的奇数为2n+1与2n+3有公因数q(q≠1),则存在非0自然数p1和p2,使得2n+1=p1×q;2n+3=p2×q,两式相减得2n+3-(2n+1)= p2×q- p1×q,即:(p2-p1)q=2,由于p2、p1、q均为非0自然数,若p2-p1=1,那么q=2,则与2n+1与2n+3是奇数矛盾,若p2-p1=2,那么q=1与假设矛盾。)

有了以上三点,我们就不难证明了。

1、如果连续的三个自然有两个奇数一个偶数,则这三个数一定是两两互质的。它们的最小公倍数就是它们的乘积。比如:[3、4、5]=3×4×5=60 [5、6、7]=5×6×7=210。

2、如果连续的三个自然数有两个偶数一个奇数。则这个奇数和这两个偶数由于是相邻的自然数一定是互质的,而这两个连续的偶数由于只有公因数1和2,所以,把这两个偶数除以它们的公因数2,所得的商一定是互质数,因此,它们的公因数就等于这三个数的乘积再除以2。


有了上面的知识,我们便可以写出如下代码——

#include<stdio.h>

int main()
{
	int n;
	long long int LCM;

	scanf("%d", &n);
	if(n == 1)
        LCM = 1;
    else if(n == 2)
        LCM = 2;
    else if(n%2 != 0)               //n为奇数
		LCM = n * (n-1) * (n-2);
	else                            //n为偶数
		LCM = ( n*(n-1)*(n-2)/2 < n*(n-1)*(n-3) ) ? n*(n-1)*(n-2)/2 : n*(n-1)*(n-3);
	printf("%I64d\n", LCM);
	return 0;
}

以上问题主要用的是连续三个数的最小公倍数。

对于任意三个数的最小公倍数,可用以下方法求解——

#include<stdio.h>

int Maximum(int x, int y, int z)
{
	int max;
	max = (x > y) ? x : y;
	max = (max > z) ? max : z;
	return max;
}

int LCM(int x, int y, int z)
{
	int i = Maximum(x, y, z) - 1, a = 1, b = 1, c = 1;
	while( (a!=0) || (b!=0) || (c!=0) )		//a,b,c不同时为零,表明i能被x,y,z同时整除
	{
		i++;
		a = i % x;
		b = i % y;
		c = i % z;
	}
	return i;
}

int main()
{
	int x, y, z;
	scanf("%d%d%d", &x, &y, &z);
	printf("%d", LCM(x, y, z));
	return 0;
}

当然,在这个算法里是可以进行一些优化的!比如,我们不需要用i++,这样一个数一个数的增加太慢了!有没有更快的方法呢?有。可以想一下,最小公倍数必然能够被三个数中的任意一个数整除。既然如此,我们不妨设最大的数字是x,那么i就可以以x的2倍、3倍、4倍等递增,这样的话会比原来高效很多倍!

同理,最大公约数也可以用类似这样的方法求解。


番外:

对于求两个数的最大公约数,更正规的方法是辗转相除法;求两个数的最小公倍数,则是两数之积除以最大公约数。

eg:12和8的最大公约数为4   
12×8/4=24   
两数的最小公倍数便是24。

关于辗转相除法,这里不再赘述。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值