C++ 蓝桥杯题目讲解汇总(持续更新)
VIP试题 最大最小公倍数
资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
已知一个正整数N,问从1~N中任选出三个数,他们的最小公倍数最大可以为多少。
输入格式
输入一个正整数N。
输出格式
输出一个整数,表示你找到的最小公倍数。
样例输入
9
样例输出
504
数据规模与约定
1 <= N <= 1 0 6 10^6 106 。
解题思路
一开始我是直接理所当然地认为最大的最小公倍数是最大三个数的乘积,于是顺手写了一下欧几里得求最大公约数,后来发现不对,直接0分,n、n-1、n-2三个数,一旦当n时偶数的时候,就发现不对劲了,为什么呢,n和n-2一定会被约去一个2,而相邻两个奇数的最大公因数是1,这种情况下对于 n ∗ ( n − 1 ) ∗ ( n − 2 ) / 2 n*(n-1)*(n-2)/2 n∗(n−1)∗(n−2)/2 和 n ∗ ( n − 1 ) ∗ ( n − 3 ) n*(n-1)*(n-3) n∗(n−1)∗(n−3)我想不用我说大家就明白谁大谁小了吧,但是就是在这种情况下,一旦n%3==0 不用说了n和n-3又有一个约数了,这时候直接计算 ( n − 1 ) ∗ ( n − 2 ) ∗ ( n − 3 ) (n-1)*(n-2)*(n-3) (n−1)∗(n−2)∗(n−3)即可,避免再引入(n-4)。
所以 全部的情况 就是如下:
1、 n<=2,res = n;
2、n%2==1,res=
n
∗
(
n
−
1
)
∗
(
n
−
2
)
n*(n-1)*(n-2)
n∗(n−1)∗(n−2)
3、
n
%
2
=
=
0
n\%2==0
n%2==0且
n
%
3
=
=
0
n\%3==0
n%3==0的话,res=
(
n
−
1
)
∗
(
n
−
2
)
∗
(
n
−
3
)
(n-1)*(n-2)*(n-3)
(n−1)∗(n−2)∗(n−3)
4、
n
%
2
=
=
0
n\%2==0
n%2==0且
n
%
3
!
=
0
n\%3!=0
n%3!=0的话,res=
(
n
)
∗
(
n
−
1
)
∗
(
n
−
2
)
(n)*(n-1)*(n-2)
(n)∗(n−1)∗(n−2)
这就是上述的全部情况了,其次需要注意的是数据的规模,显然 1 0 6 10^6 106的话 int 溢出,直接long long 吧!
代码-C++
#include<iostream>
using namespace std;
int main(){
long long n;
cin>>n;
if (n<=2)
cout<<n;
else if (n%2==1)
cout<<n*(n-1)*(n-2);
else if (n%2==0&&n%3!=0)
cout<<n*(n-1)*(n-3);
else
cout<<(n-1)*(n-2)*(n-3);
return 0;
}
本文详细解析了蓝桥杯C++竞赛中的一道关于寻找最大最小公倍数的题目,通过分析不同条件下的最优解策略,提供了一种高效算法实现方案。
798

被折叠的 条评论
为什么被折叠?



