您的位置:首页 > 其它

算法训练 最大的最小公倍数

2017-02-08 20:26 381 查看
算法训练 最大最小公倍数  

时间限制:1.0s   内存限制:256.0MB

问题描述

已知一个正整数N,问从1~N中任选出三个数,他们的最小公倍数最大可以为多少。

输入格式

输入一个正整数N。

输出格式

输出一个整数,表示你找到的最小公倍数。

样例输入

9

样例输出

504

数据规模与约定

1 <= N <= 106。

在一组数中找三个数,使他们的最小公倍数最大,我们知道,两个数的最小公倍数在最大的情况就是当两个数互质的时候,他们的最小公倍数就是这两个数的乘积,而且还有那么一个定理,即两个相邻的自然数互质,即使我们不知道定理怎么证明,但大体能想出来,但这是三个数,也就是说存在  奇-偶-奇  和 偶-奇-偶 两种情况。

一:奇-偶-奇 这种情况用于n是奇数的情况,即 最大的三个数就是 n,n-1,n-2,那么可以看到,因为n和n-2都是奇数,所以肯定不存在公因数2,假设三个数中有一个存在因数3,那么另外两个肯定不存在因数3,因为他们的变化范围都小于3,也就是说,这三个数不仅是最大的,还是互质的,也就是说最大的最小公倍数就是这三个数的乘积,即n*(n-1)*(n-2)相信大部分人都可以想到这一步

二:偶-奇-偶 对于这种情况两个偶数肯定是存在公因数2,也就是意味着最小公倍数要除以2,这是绝对不能容忍的,所以我们稍微缩小一下数,即n,n-1,n-3,这样就又变成奇-偶-奇的结构了,但还有一个问题,就是假如偶数n存在因数3,那么n-3也必定有因数3,这直接导致最小公倍数除以3,更加不能容忍,为了保持奇-偶-奇的结构不变,只能变那个偶数,而离他最近的偶数就是n-2了,这下就完美了,3个数依然是互质的,最小公倍数就是(n-1)*(n-2)*(n-3)

三:虽然题目中明确的说了,1 <= N <= 106,但我依然觉得这个范围有点愚蠢,在1个数中任意选出3个数我也是醉了,如果你觉得这没什么的话,那接下来就让人吐血了,因为你永远无法提交正确,

[cpp] view
plain copy

#include<iostream>  

using namespace std;  

int main()  

{  

    long long n,ans;  

    cin>>n;  

    if(n<=2)  

    ans=n;  

    else if(n%2==1)  

    ans=n*(n-1)*(n-2);  

    else  

    {  

        if(n%3==0)  

        ans=(n-1)*(n-2)*(n-3);  

        else  

        ans=n*(n-1)*(n-3);  

    }  

    cout<<ans<<endl;  

    return 0;  

}   
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: