编号:ALGO-2 题目:最大最小公倍数 关键字:贪心 类型:普通试题

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

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

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

分析:

1、当n为奇数时,

n为奇数,n-1为偶数,n-2为奇数,他们三个的公约数肯定不为2,又因为它们是连续的相邻两个数相差1,所以他们的公约数不可能大于2,所以他们三个数两两互质结果就是他们三个的乘积。

2、当n为偶数时,

n为偶数,n-1为奇数,n-2为偶数,他们的乘积得除以2才能是最小公倍数,所以考虑把n-2换成n-3,但如果n是3的倍数那么,n-3一定也是3的倍数,所以这种情况要又要考虑n是否是3的倍数:

①若n不是3的倍数,n-3肯定也不是3的倍数,且他们的公约数不可能大于3,所以这时结果是n*(n-1)*(n-3)。

②若n是3的倍数,则他们的乘积得除以3才能是最小公倍数,所以考虑把n-3换成n-4是偶数不行,考虑n-5,而如果这个可以 那个其值肯定要小于(n-1)*(n-2)*(n-3) = n^3 -6*n^2+11n-6(对于n>1来说都成立),所以综上分析,当n是偶数且是3的倍数时,n*(n-1)*(n-2)需要除以2,n*(n-1)*(n-3)需要除以3,n*(n-1)*(n-4)需要除以2,而n*(n-1)*(n-5)<n*(n-1)*(n-2)所以这种情况下结果是n*(n-1)*(n-2).

 

#include <stdio.h>
#include <stdlib.h>

int main()
{
    long long N,ans;
    scanf("%I64d",&N);
    if(N<=2){
        ans=N;
        printf("%I64d",ans);
    }
    else if(N%2){
            ans= N*(N-1)*(N-2);
    }
    else
    {
        if(N%3){
                ans=N*(N-1)*(N-3);
        }
       else{
            ans=N*(N-1)*(N-2);

       }
    }
    printf("%I64d",ans);
    return 0;
}

 

注:关于long long 型数据,在不同的编译器中有不同的输出:

在codeblocks中是用:

long long a;

printf("%I64d",a);

至于像VC++等编译器,大家自己查一下吧,感觉比较乱不整理 了。。。

 

 

 

 

 

 

 

 

posted @ 2017-05-18 19:51  路人姜。  阅读(245)  评论(0编辑  收藏  举报