C++蓝桥杯 基础练习之最大最小公倍数

本文详细解析了蓝桥杯C++竞赛中的一道关于寻找最大最小公倍数的题目,通过分析不同条件下的最优解策略,提供了一种高效算法实现方案。
部署运行你感兴趣的模型镜像

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 nn1n2/2 n ∗ ( n − 1 ) ∗ ( n − 3 ) n*(n-1)*(n-3) nn1n3我想不用我说大家就明白谁大谁小了吧,但是就是在这种情况下,一旦n%3==0 不用说了n和n-3又有一个约数了,这时候直接计算 ( n − 1 ) ∗ ( n − 2 ) ∗ ( n − 3 ) (n-1)*(n-2)*(n-3) (n1)(n2)(n3)即可,避免再引入(n-4)。

所以 全部的情况 就是如下:

1、 n<=2,res = n;
2、n%2==1,res= n ∗ ( n − 1 ) ∗ ( n − 2 ) n*(n-1)*(n-2) n(n1)(n2)
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) (n1)(n2)(n3)
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)(n1)(n2)

这就是上述的全部情况了,其次需要注意的是数据的规模,显然 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;
} 

您可能感兴趣的与本文相关的镜像

Qwen-Image-Edit-2509

Qwen-Image-Edit-2509

图片编辑
Qwen

Qwen-Image-Edit-2509 是阿里巴巴通义千问团队于2025年9月发布的最新图像编辑AI模型,主要支持多图编辑,包括“人物+人物”、“人物+商品”等组合玩法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值