问题描述
已知一个正整数N,问从1~N中任选出三个数,他们的最小公倍数最大可以为多少。
输入格式
输入一个正整数N。
输出格式
输出一个整数,表示你找到的最小公倍数。
样例输入
9
样例输出
504
数据规模与约定
1 <= N <= 106。
参考:https://blog.youkuaiyun.com/wr132/article/details/43538151 这位大佬 写的 我这里就写我自己的感受了 同志们 直接看大佬分析就好了很细
分析:我算法很差 贪心更不用说 第中第 题中求序列中随机三个数的最大公倍数 我们知道 两个数的最大公倍数是由 两个数的乘积除与两个数 最小公约数 得到的 所以 公约数越小 原数(就是求公倍数的那两个数 我这里称为原数) 越大 最终求得的公倍数就越大 并且这里求的是三个数 不是两个 情况更加复杂
利用的是两个原理 : 互质最小公倍数最大 相邻自然数互质
当N为奇数时 构成 奇 偶 奇 由于存在两个奇数 所以不会存在公因子2 由于差小于3 所以更不存在公因子为 3 为4 大于3的情况 所以最大公倍数为n*(n-1)*(n-2)
当N为偶数时 构成 偶 奇 偶 这时由于 存在两个偶所以 公因子含有2(原因:三个数求最大公倍数 可以看作先由两个数求最大公倍数 然后把求得的最大公倍数在与第三个数公倍 所以如果两个偶数先求最大公倍数那么 必然会产生一个比2大于等于的最大公约数 结合最大公倍数的求法 原因显而易见了) 所以不行 换掉最小的 把(n-2)换位(n-3) 但此时 n-(n-3) ==3 相差为3 那么 n与(n-3) 之间就可能存在 公因子为3 的情况 着也是不行的 所以此时 要么 再把(n-3)换位(n-5) 要么就把n换下 然后构成 (n-1) (n-2) (n-3)
根据贪心算法 显然用后者
自己还是第中第呀
#include<iostream>
#include <algorithm>
#include <string>
using namespace std;
int main()
{
long long n;
cin >> n;
if(n<3)
{
cout <<n;
}else if(n%2)
{
cout <<n*(n-1)*(n-2);
}else
{
if(n%3==0)
cout <<(n-1)*(n-2)*(n-3);
else
cout <<n*(n-1)*(n-3);
}
return 0;
}