zoukankan      html  css  js  c++  java
  • 编号: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++等编译器,大家自己查一下吧,感觉比较乱不整理 了。。。

     

     

     

     

     

     

     

     

    祝你早日攒够失望,然后开始新的生活。
  • 相关阅读:
    语言基础
    进制转换
    添加
    查找
    继承
    封装
    面向基础 c#小复习
    主外键
    三个表的关系
    插入信息,模糊查询,聚合函数,时间函数,排序,字符串函数,数学函数,求个数,球最大
  • 原文地址:https://www.cnblogs.com/LuRenJiang/p/6851653.html
Copyright © 2011-2022 走看看