描述
高中时我们对最小公倍数就已经很熟悉了,相信你很快就可以把这个问题解决。这次的问题是:给你一个正整数n,任取三个不大于n的正整数,取法不限,每个数可取多次,使得取到的这三个数的最小公倍数在所有取法中是最大的。
例如当n = 5 时,不大于5的数为1、2、3、4、5。则应该选3、4、5三个数,它们的最小公倍数是60,在所有取法中是最大的。因此我们得到结果60。
是不是很简单?抓紧时间 AC 吧。
输入
输入包含多组测试数据。每组数据为一个正整数n(1≤n≤10^6)。
输出
对每组测试数据,输出一个整数,代表所有可能取法中,选出的三个数的最小公倍数的最大值。
样例输入
5 7
样例输出
60 210
来源
题意分析:在n个数中找任意三个数的最小公倍数,并且求得最大的最小公倍数(重点在于最大)。
思路分析:最大 最小公倍数,联想到两个数的求最大最小公倍数,即两个数的乘积(注:连续的两
个自然数是互斥的)。
同样,我们可以拿最后三个数来做考虑。
1.当n为奇数时,n,n-1,n-2为奇偶奇,里面只有一个偶数,所以不会有2这个因子。这三个数相差不
到3,所以也不会有因子3,故符合题意。
2.当n为偶数时,n,n-1,n-2为偶奇偶,此时n,n-2肯定含有因子2,所以除于2不值得。所以考虑将
n-2 换成n-3,变成奇偶奇,此时也有一个问题n和n-3,如果n%3==0,则除于3更不值得。仍根据奇偶奇
的原则,变动偶数n为n-2,此时换成n-1,n-2,n-3和1情况一样。故此时符合题意。
#include<stdio.h>
typedef long long ll;
int main()
{
ll n,ans;
while(scanf("%lld",&n)!=EOF)
{
if (n<=2)
ans = n;
else if (n%2)
ans = n * (n-1) * (n-2);
else
{
if (n%3)
ans = n * (n-1) * (n-3);
else
ans = (n-1) * (n-2) * (n-3);
}
printf("%lld\n",ans);
}
return 0;
}