最大最小公倍数

 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\n",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。

 

转载于:https://www.cnblogs.com/WDKER/p/5146876.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值