问题描述
已知一个正整数N,问从1~N中任选出三个数,他们的最小公倍数最大可以为多少。
输入格式
输入一个正整数N。
输出格式
输出一个整数,表示你找到的最小公倍数。
样例输入
9
样例输出
504
数据规模与约定
1 <= N <= 106 。
推荐一篇很好的题解:点击这里
一开始想到的 代码1(暴力法,不过暴力的超时了。。。AQA)
#include <iostream>
using namespace std;
int gcd(int x, int y)//目的求出这两个数的最大公约数 (转辗相除法)
{
int r;
while (y != 0)
{
r = x % y;
x = y;
y = r;
}
return x;
}
int LeastCommonMultiple(int a, int b, int c)//目的求出三个数的最小公倍数
{
int two = a * b / gcd(a, b);
int three = two * c /gcd(two, c);
return three;
}
int main() {
int N;
cin >> N;
int max = 0;
for (int i = 1; i <= N; i++)
{
for (int j = 2; j <= N; j++)
{
for (int k = 3; k <= N; k++)
{
if (i != j && j != k && k != i)
{
if (max < LeastCommonMultiple(i, j, k))
{
max = LeastCommonMultiple(i, j, k);
}
}
}
}
}
cout << max;
return 0;
}
代码2:(运用了数论的知识)
当然,需要明白他们的最小公倍数的最大必然是在N附近的。至此,才有了下面的呈现。
#include <iostream>
using namespace std;
int main() {
long long int N, ans;//这里为long long(或long long int),不能是long或int
cin >> N;
if (N % 2 == 1)//当n是奇数时
{
ans = N * (N - 1) * (N - 2);
}
else
{
if (N % 3)//当n为偶数并且n不能整除3时
//不能写成N % 3==1,因为还有N % 3==2的时候
{
ans = N * (N - 1) * (N - 3);
}
else {//当n为偶数并且n能整除3时
ans = (N - 3) * (N - 1) * (N - 2);
}
}
cout << ans;
return 0;
}