【逻辑\贪心】算法训练 最大最小公倍数

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

资源限制
时间限制:1.0s 内存限制:256.0MB

问题描述

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

输入格式

输入一个正整数N。

输出格式

输出一个整数,表示你找到的最小公倍数。

样例输入

9

样例输出

504

数据规模与约定

1 <= N <= 106。

代码

#include <iostream>
using namespace std;
//求最大的最小公倍数(相邻互质的最小公倍数最大,即为它们的乘积) 
int main()
{
	long long n;
	cin>>n;
	int max=0;
	if(n<=2)
		cout<<2<<endl;	
	else if(n%2!=0)//如果n为奇数就是奇-偶-奇,它们不可能有2 
		cout<<n*(n-1)*(n-2);
	else if(n%3==0)//如果是偶数,一定不互质,因为存在2的因子,
//	所以就要变成两种奇数的形式,把最后的偶数减去一,但是这样当n为3的倍数时
//n-3也会是3的倍数,因为它们差值为3,所以这时候就只能改变第一个偶数,而离他最近的偶数是n-2 
		cout<<(n-1)*(n-2)*(n-3);
	else
		cout<<n*(n-1)*(n-3);
}

总结

需要使用到两条规律:

  • 两个数最小公倍数最大的情况发生在它们互质时

  • 相邻的自然数互质

相邻的情况可以分为(奇-偶-奇、偶-奇-偶)两种情况,对于第一种一定是互质的,因为它们不存在2和3的因子。
第二种情况要改造成两个奇数一个偶数的构造:

  • 若第一个偶数非3的倍数,那么最后一个偶数可以放心减一,它们两个就不会出现存在有3这个公因子的情况
  • 否则只能将第一个偶数换成下一个偶数,成为奇-偶-奇的情况
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_Amonlisa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值