算法训练 最大最小公倍数

问题描述

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

输入格式

输入一个正整数N。

输出格式

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

样例输入

9

样例输出

504

数据规模与约定

1 <= N <= 106。

 

参考:https://blog.youkuaiyun.com/wr132/article/details/43538151  这位大佬 写的 我这里就写我自己的感受了  同志们 直接看大佬分析就好了很细 

分析:我算法很差 贪心更不用说 第中第  题中求序列中随机三个数的最大公倍数  我们知道   两个数的最大公倍数是由 两个数的乘积除与两个数 最小公约数 得到的 所以 公约数越小 原数(就是求公倍数的那两个数 我这里称为原数) 越大 最终求得的公倍数就越大   并且这里求的是三个数 不是两个 情况更加复杂    

利用的是两个原理 :  互质最小公倍数最大    相邻自然数互质

当N为奇数时 构成 奇 偶 奇  由于存在两个奇数 所以不会存在公因子2 由于差小于3 所以更不存在公因子为 3  为4 大于3的情况 所以最大公倍数为n*(n-1)*(n-2)

当N为偶数时  构成 偶 奇 偶  这时由于 存在两个偶所以 公因子含有2(原因:三个数求最大公倍数 可以看作先由两个数求最大公倍数 然后把求得的最大公倍数在与第三个数公倍  所以如果两个偶数先求最大公倍数那么 必然会产生一个比2大于等于的最大公约数 结合最大公倍数的求法 原因显而易见了) 所以不行  换掉最小的 把(n-2)换位(n-3) 但此时 n-(n-3) ==3  相差为3  那么 n与(n-3) 之间就可能存在 公因子为3 的情况 着也是不行的 所以此时 要么 再把(n-3)换位(n-5) 要么就把n换下 然后构成 (n-1) (n-2) (n-3)

根据贪心算法 显然用后者 

自己还是第中第呀

#include<iostream>
#include <algorithm>
#include <string>
using namespace std;
int main()
{
    long long n;
    cin >> n;

    if(n<3)
    {
        cout <<n;
    }else if(n%2)
    {
        cout <<n*(n-1)*(n-2);
    }else
    {
        if(n%3==0)
        cout <<(n-1)*(n-2)*(n-3);
        else
        cout <<n*(n-1)*(n-3);
    }


  return 0;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值