三个数的最小公倍数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。
关于辗转相除法,这里不再赘述。
- 三个数的最小公倍数LCM (least common multiple)
- hdu 1019 Least Common Multiple(几个数的最小公倍数)
- hdoj1019 Least Common Multiple(一组数的最小公倍数)
- Least Common Multiple HDU 1019(一列数的最小公倍数)
- Common Multiple and Least Common Multiple(LCM)
- Least Common Multiple(最小公倍数)
- hdu_1019 Least Common Multiple(最小公倍数)
- 最小公倍数(Least Common Multiple)
- Least Common Multiple最小公倍数 17
- zoj1797 Least Common Multiple 最小公倍数
- Least Common Multiple(最小公倍数)
- HDU1019 - Least Common Multiple (LCM的简单应用)
- HDOJ 1019 Least Common Multiple (求n个数的LCM)
- HDU1019 Least Common Multiple(求多个数的最小公倍数)
- HDOJ1019 Least Common Multiple(求多个数的最小公倍数)
- hdu 1019 Least Common Multiple (水题,LCM)
- HDU - 1019 - Least Common Multiple (lcm)
- HDU1019 Least Common Multiple 就是求最小公倍数
- Centos修改root用户密码
- SimpleDateFormat格式说明
- UINavigationContoller 多级页面 越级跳转 内存释放问题
- Activiti 5.17 Activiti与restlet的继承关系和扩展
- 隐马学习一
- 三个数的最小公倍数LCM (least common multiple)
- Android中播放PCM(用AudioTrack类)
- 安装SpringExt以查看schema文件
- GrideView简单使用
- js解析本地xml文件
- 寒假之作—HDU—求余运算
- CSDN 支持Markdown写文章了!
- UVa 1025 A Spy in the Metro(DP)
- java代码请求http