蓝桥杯-最大最小公倍数

来源:互联网 发布:网络用语我爱萝卜 编辑:程序博客网 时间:2024/05/23 23:49
问题描述    已知一个正整数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;}