问题描述
已知一个正整数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++等编译器,大家自己查一下吧,感觉比较乱不整理 了。。。