您的位置:首页 > 其它

蓝桥杯-最大最小公倍数

2017-11-27 21:19 246 查看
问题描述
已知一个正整数N,问从1~N中任选出三个数,他们的最小公倍数最大可以为多少。

输入格式
输入一个正整数N。

输出格式
输出一个整数,表示你找到的最小公倍数。
样例输入
9
样例输出
504
数据规模与约定
1 <= N <= 106。


如果按照正常的暴力搜索来解决问题,可想而知肯定会超时的,所以要知道一点:相邻的两个正整数是互斥的,而且互斥的正整数的最小公倍数就是这两个正整数的乘积。

如果输入的n是奇数,那么n、n-1、n-2必定是两两互斥的(两奇夹一偶)

如果输入的n是偶数,n和n-2必定有公因子2,因此我们将n-2换成n-3试一下,但如果偶数n本身就可以被3整除,那么n-3也可以被3整除,所以当n既是偶数,又可以被3整除的时候我们直接用n-1、n-2、n-3三个数(两奇夹一偶)的乘积来表示最大最小公倍数。

#include <iostream>

using namespace std;
/*
int main()
{
long n;
cin>>n;
long long Max=0,LCM=1;
for(int i=1;i<n;i++)
{
for(int j=i+1;j<n;j++)
{
for(int k=j+1;k<=n;k++)
{
int l=i,m=j,n=k;
while(l%2==0&&m%2==0&&n%2==0){
LCM*=2;
l/=2;m/=2;n/=2;
}
LCM=LCM*l*m*n;
if(LCM>Max)Max=LCM;
LCM=1;
}
}
}
cout<<Max;

return 0;
}*/

int main(){
long long n,ans;
cin>>n;
if(n<=2)ans=n;
else if(n%2)ans=n*(n-1)*(n-2);
else{
if(n%3)ans=n*(n-1)*(n-3);
else
ans=(n-1)*(n-2)*(n-3);
}
cout<<ans;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: