试题 算法训练 最大最小公倍数
资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
已知一个正整数N,问从1~N中任选出三个数,他们的最小公倍数最大可以为多少。
输入格式
输入一个正整数N。
输出格式
输出一个整数,表示你找到的最小公倍数。
样例输入
9
样例输出
504
数据规模与约定
1 <= N <= 106。
代码
#include <iostream>
using namespace std;
//求最大的最小公倍数(相邻互质的最小公倍数最大,即为它们的乘积)
int main()
{
long long n;
cin>>n;
int max=0;
if(n<=2)
cout<<2<<endl;
else if(n%2!=0)//如果n为奇数就是奇-偶-奇,它们不可能有2
cout<<n*(n-1)*(n-2);
else if(n%3==0)//如果是偶数,一定不互质,因为存在2的因子,
// 所以就要变成两种奇数的形式,把最后的偶数减去一,但是这样当n为3的倍数时
//n-3也会是3的倍数,因为它们差值为3,所以这时候就只能改变第一个偶数,而离他最近的偶数是n-2
cout<<(n-1)*(n-2)*(n-3);
else
cout<<n*(n-1)*(n-3);
}
总结
需要使用到两条规律:
-
两个数最小公倍数最大的情况发生在它们互质时
-
相邻的自然数互质
相邻的情况可以分为(奇-偶-奇、偶-奇-偶)两种情况,对于第一种一定是互质的,因为它们不存在2和3的因子。
第二种情况要改造成两个奇数一个偶数的构造:
- 若第一个偶数非3的倍数,那么最后一个偶数可以放心减一,它们两个就不会出现存在有3这个公因子的情况
- 否则只能将第一个偶数换成下一个偶数,成为奇-偶-奇的情况