蓝桥杯C++ 算法训练 最大最小公倍数

蓝桥杯C++ 算法训练 最大最小公倍数

一、题目

问题描述
已知一个正整数N,问从1~N中任选出三个数,他们的最小公倍数最大可以为多少。
输入格式
输入一个正整数N。
输出格式
输出一个整数,表示你找到的最小公倍数。
示例
输入:9
输出:504
数据规模与约定
1 <= N <= 106


二、问题分析

我对这个题目的理解是:
从区间[1,N]中取出任意的三个数,并求这三个数的最小公倍数,最后求出M种取数情况所得最小公倍数的最大值。
单从代码的角度理解,首先想到的最暴力的方法是将所有情况的最小公倍数求出来,然后比较大小得到最终结果,但是这种方法的时间复杂度会很高,会达不到题目的资源限制要求,因此我们应该试着从题目的数学角度进行理解。
从数学角度来看,最终得到的结果是一个最小公倍数,这就意味着这个结果是由三个互质的数相乘得到的。从计算方法看,选取的三个数越大,乘积越大;从所需的结果看,需要三个数互质。
因此,原问题就转化为求区间[1,N]中最大且互质的三个数。此时,当N为奇数时,易知N,(N-1),(N-2)为最大且互质的三个数;当N为偶数时,由于(N-2)也为偶数,而再下一个数是(N-3),存在N与(N-3)不互质的可能性,因此需要分N%3==0和N%3!=0两种情况。


至此,分析完毕,代码如下。

三、代码示例

#include <iostream>

using namespace std;

int main()
{
   
    int N;
    cin>>N;
    int max_min;
    if
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值