最大的最小公倍数 | ||||||
| ||||||
Description | ||||||
从小学我们就学过最小公倍数,今天这个问题也是关于最小公倍数lcm (lease common multiple)的。我们的问题是,给定一个整数n后,你需要任取三个不大于n的数,取法不限,每个数可取多个,使得取到的这三个数的最小公倍数在所有取法中是最大的。 举个例子:给定的n是5。那么不大于5的可选数为1、2、3、4、5。这里选出3、4、5三个数的最小公倍数是60,在所有取法中是最大的。因此我们得到结果60。 | ||||||
Input | ||||||
输入包含多组测试数据,每组为一个整数n (1 <= n <= 10^6) 如上所述。 | ||||||
Output | ||||||
对每组测试数据,输出一个整数,代表所有可能取法中,选出的不超过n的三个数的最小公倍数的最大值。允许选取相同的数多次。 | ||||||
Sample Input | ||||||
5 7 | ||||||
Sample Output | ||||||
60 210 | ||||||
Hint | ||||||
输出结果可能会超出32位整数所能存放的范围,你可能需要64位整型变量存储答案。 | ||||||
Author | ||||||
ZeroPointer@HRBUST |
而且这四个数的公约数最大为3,因为n与n-3差3。若n为奇数时n,n-1,n-2必然互质, 因为n-2~n差2,且n与n-2都是奇数。若n为偶数那么三个数必然是两奇一偶(不会被二整除),而且两个奇数要不能被三整除。
#include <stdio.h>
int main()
{
long long n;
while(scanf("%lld", &n) != EOF)
{
if(n <= 2)
{
printf("%lld\n", n); //注意n<=2的情况
}
else
{
if(n % 2 == 0)
{
if(n % 3 == 0) //当n能被3整除时n-1不能,且n-3也不能,所以n-1,n-2,n-3互质
{
printf("%lld\n", (n-1)*(n-2)*(n-3));
}
else //当n不能被3整除时,选两奇一偶n,n-1,n-3,
{
printf("%lld\n", n*(n-1)*(n-3));
}
}
else //当n为奇数时,n,n-1,n-2必定互质
{
printf("%lld\n", n*(n-1)*(n-2));
}
}
}
return 0;
}