AI智能
改变未来

算法练习-蓝桥杯练习系统-算法训练-ALGO-2 最大最小公倍数(※)


算法练习-蓝桥杯练习系统-算法训练-ALGO-2 最大最小公倍数(※包括最大公约数、最小公倍数的总结)

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

一开始以为这题的重点在,怎么求三个数的最小公倍数(LCM),然后去复习了一遍求最小公倍数的几种方法,也算是一个容易忘记的总结,将它放在本文结尾。后面发现用穷举法去找三个数的组合效率太低了。

这个时候才转变思路,往乘积大的那个方面去想,但是无奈数学基础不好,没有思考到 互质 那一层,后面找到了一篇回答,才恍然大悟,回答链接在此,作者:阿拉伯字母二世。

涉及到的数学常识,应该是小学数学吧,我太菜了

  • 两个数的最小公倍数一定小于等于其乘积;而当这两个数互质时(如果组成分数无法约分时),其最小公倍数最大,等于其乘积。
  • 两个相邻的数,一定互质。也就是:最大公约数=1,最小公倍数=其乘积。
  • 相邻的两个奇数也一定互质。
  • 推广到多个数,使其两两互质,这时:最大公约数=1,最小公倍数=多个数乘积。
  • 差为3的两个数不互质!!!(例如9和6)
    为什么要加上最后这一条呢? 很像是一句废话 ,但是容易犯错。因为如果N是偶数,在找最大的三个两两互质的数的时候,因为N和N-2都是偶数,并不互质,这样就会找到N,N-1,N-3这个组合,所以这条是差为3的两个数不互质,而不是差为2的两个数不互质,也不是差为5的两个数不互质(当然如果题目改成任选五个数进行组合,那就可以加上这一条了)

掌握以上质数有关性质,就能解出这道题了。
思路找对后,很简单。

#include <iostream>using namespace std;int main(){long long n = 0;cin>>n;long long res = 0;if(n==1) cout<<\"1\";else if(n<=2) cout<<\"2\";else if(n<=3) cout<<\"6\";else if(n%2==1){res = n*(n-1)*(n-2);}else{if(n%3==0){res =(n-1)*(n-2)*(n-3);}else{res =n*(n-1)*(n-3);}}cout<<res;return 0;}

还有一个在代码中需要注意的,就是n和答案的数据类型,必须是

long long

类型,测试数据第一个就是n=95125,ans=861460772824848

每个long long类型的变量占8字节,64位
其表示范围为-9223372036854775808 ~ 9223372036854775807。-263 ~ 263-1
大概1019
long long 类型输出的时候,printf函数,用

%lld

格式输出

以后看到类似题目,记得质数有关这些性质!!!!!!!!!!!!!!!!!

最小公倍数、最大公约数

最大公约数

手头有纸有笔,最好用的是短除法。两个数一起除,直到互质,最后把所有的除数相乘。

除此之外,纸笔可以算的还有:

  • 辗转相除法
/*辗转相除法基本思想:被除数 / 除数 =商...余数将每次除得余数作第二次的除数,除数作第二次的被除数,直到余数为0,本次除数(上一次余数)即为最大公约数。*/int min_ab = 0;while(1){cout<<a<<\"/\"<<b<<\"=\"<<a/b<<\"...\"<<a%b<<endl;min_ab = a%b;int temp = b;b = a%b;a = temp;if(a%b==0) break;}
  • 辗转相减法
/*辗转相除法基本思想:A-B=C,包含差的ABC三个数中选取最小的两个相减,直到取得的两数相等,即下一次相减等于0,相等的数即为最大公约数。*/while (m != n){while (m>n) { m = m - n; }while (n>m) { n = n - m; }}

辗转相除和辗转相减计算机也可以用,多个数可以用递归,只需要将前两个数得到的最大公约数和第三个再求最大公约数即可

最小公倍数

  • 公式法:(已知最大公约数,或者最大公约数好求)
    性质:两数乘积 = 两数的最大公约数 * 两数的最小公倍数
    所以在已知最小公约数的情况下,用乘积除以最大公约数得最小公倍数。

不知道最大公约数的情况下:

  • 短除法(将除得所有外侧结果相乘)

  • 分解质因数
    先把这几个数的质因数分解写出来,最小公倍数等于它们所有的质因数的乘积(如果有几个质因数相同,则比较两数中哪个数有该质因数的个数较多,乘较多的次数)。
    举例:求27和15的最小公倍数
    27 = 3 * 3 * 3
    15 = 3 * 5
    按照规则是3*5,但是3是两个数分解得到相同的质因数,这个时候选择质因数个数较多的成为它的次数。较多的次数是3,即33 * 5 = 135,最大公倍数为135。

赞(0) 打赏
未经允许不得转载:爱站程序员基地 » 算法练习-蓝桥杯练习系统-算法训练-ALGO-2 最大最小公倍数(※)