zoukankan      html  css  js  c++  java
  • 最大最小公倍数

     1 #include<cstdio>
     2 #include<cstring>
     3 using namespace std;
     4 int main()
     5 {
     6 
     7     long long ans,n;
     8     while(~scanf("%lld",&n))
     9     {
    10         if(n<=2)
    11         ans=2;
    12         else
    13         if(n%2==1)
    14         ans=n*(n-1)*(n-2);
    15         else
    16         {
    17             if(n%3!=0)
    18             ans=(n-1)*n*(n-3);
    19             else
    20             ans=(n-2)*(n-1)*(n-3);
    21         }
    22         printf("%lld
    ",ans);
    23         
    24     }
    25 }
    View Code

    任何两个数的最大公因子是俩数的差。没错就是这样的吧~!

    背囊:

    当n为奇数时,答案一定是n*(n-1)*(n-2)。

    当n为偶数时,答案可能是(n-1)*(n-2)*(n-3),也可能是n*a*b,其中a>=n-3。

    别人的解释:

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

    一:奇-偶-奇 这种情况用于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个数我也是醉了,如果你觉得这没什么的话,那接下来就让人吐血了,因为你永远无法提交正确,即使在哈尔滨理工大学的OJ(http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1632)上AC了,在蓝桥杯上依然只能得60分,没错,就是这么任性。

    刚才自己写的n定义为int型,提交error,最后一看范围太小超了,定义long long行ok。

  • 相关阅读:
    EBS SQL > Form & Report
    oracle sql 优化分析点
    MRP 物料需求计划
    MRPII 制造资源计划
    Barcode128 应用实务
    Oracle SQL语句优化技术分析
    APPSQLAP10710 Online accounting could not be created. AP Invoice 无法创建会计分录
    Oracle数据完整性和锁机制
    ORACLE Responsibility Menu Reference to Other User
    EBS 常用 SQL
  • 原文地址:https://www.cnblogs.com/WDKER/p/5146876.html
Copyright © 2011-2022 走看看