蓝桥杯 试题 算法训练 ALGO-2 最大最小公倍数

试题 算法训练 最大最小公倍数

资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述

已知一个正整数N,问从1~N中任选出三个数,他们的最小公倍数最大可以为多少。
输入格式

输入一个正整数N。
输出格式
输出一个整数,表示你找到的最小公倍数。
样例输入
9
样例输出
504
数据规模与约定

1 <= N <= 106。
题解:通过数学性质可知,当两个数字的最大公约数约小,其最小公倍数越大,所以首先不能取同样的数字,于是可以发现一个规律:
如果输入n为奇数,则n,n-1,n-2任意两个数字最大公约数都为1,那么此时直接n*(n-1)*(n-2)就是他们的最小公倍数,也是在1-n之间任取3个数能构成的最大的最小公倍数。

也就是,当n为奇数,直接输出n*(n-1)*(n-2)

如果输入n为偶数,同样我们希望保留接近n的数字,然后找彼此最大公约数很小的其他数字,可以发现此时n与n-1的最大公约数为1,此时n与n-1构成的最小公倍数最大,然后再往后找一个数字,我们不能选取n-2,因为n和n-2都为偶数最大公约数为2,那么我们找n-3,仿佛可以满足,因为n-3与n都是奇数,那么这种情况最大公约数一定为1吗?其实真不一定,因为n与n-3存在3的数字差,如果n此时不仅为偶数,恰好为3的倍数,那么n-3肯定也是3的倍数,此时最大公约数就为3,结果反而比取n-2时更小了,那么可以知道如下情况:
如果n为偶数:
if gcd(n,n-3)==1,答案为n*(n-1)(n-3)
else 选取n,n-1,n-2结果比选取n,n-1,n-3大
现在对n,n-1,n-2再进行判断选择,我们突然联想到奇数,因为n为偶数,n-1就为奇数,如果选择n-1,n-2,n-3和选取n,n-1,n-2相比呢,计算可知:
n为偶数时,选择n,n-1,n-2最小公倍数=n
(n-1)(n-2)/2,
选择n-1,n-2,n-3时最小公倍数=(n-1)
(n-2)*(n-3)
直接看计算公式就知道n-1,n-2,n-3时更大,所以选择这个,于是我们的所有情况全部考虑结束。

得结论如下:

if n<=2
	answer=n 
else if n%2==1:
	answer=n*(n-1)*(n-2)
else
	if gcd(n,n-3)==1
		answer=n*(n-1)*(n-3)
	else
		answer=(n-1)*(n-2)*(n-3)

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
	ll n;
	cin>>n;
	if(n<=2)
	{
		cout<<n<<endl;
	}
	else
	{
		ll ans;
		if(n%2==0)
		{
			if(__gcd(n,n-3)!=1)
			ans=(n-1)*(n-2)*(n-3);
			else ans=n*(n-1)*(n-3);			
		}
		else ans=n*(n-1)*(n-2);
		cout<<ans<<endl;
	}	
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值