算法训练 最大最小公倍数
时间限制:1.0s 内存限制:256.0MB
问题描述
已知一个正整数N,问从1~N中任选出三个数,他们的最小公倍数最大可以为多少。
输入格式
输入一个正整数N。
输出格式
输出一个整数,表示你找到的最小公倍数。
样例输入
9
样例输出
504
数据规模与约定
1 <= N <= 106。
首先,大于1的两个相邻的自然数必定互质。
n是奇数时,n、n-1、n-2必定两两互质,最大公倍数为 n*(n-1)*(n-2)。 证明:n是奇数,那么n,n-1,n-2一定是两奇加一偶的情况。则一定不存在公因子2,因为只有一个偶数。假设剩下的n,n-2中有一个数能被3整除,那么另一个数一定不能被3整除。为此,n,n-1,n-2的乘积不仅是最大的公倍数,而且一定两两互质。
n是偶数且不能被3整除时,n和n-2必定有公因子2,那么最大公约数就可以换成 n*(n-1)*(n-3) 。
但是若n是偶数且能被3整除,那么n和n-3就有公因子3,最大公约数换成(n-1)*(n-2)*(n-3),两奇夹一偶的情况。
还要注意应该用long long存数据。
此外,本题在蓝桥OJ上的数据有误,只能得60分。。
参考博客:http://www.cnblogs.com/PJQOOO/p/4394313.html
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int main(){
//freopen("input.txt","r", stdin);
//freopen("output.txt", "w", stdout);
long long n;
while(~scanf("%lld", &n) ) {
if(n < 3) {
printf("%lld\n", n);
}
else if(n % 2 != 0) {
printf("%lld\n", (n - 2) * (n - 1) * n);
}
else {
if(n % 3 != 0) {
printf("%lld\n", (n - 3) * (n - 1) * n);
}
else {
printf("%lld\n", (n - 3) * (n - 2) * (n - 1));
}
}
}
return 0;
}