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

来源:互联网 发布:网络装修 知乎 编辑:程序博客网 时间:2024/05/21 10:09

问题引入——

问题描述
已知一个正整数 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。

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

0 0
原创粉丝点击