算法训练 最大最小公倍数

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

题目分析

 这应该算是考究数学知识的一道题

 先提出一个问题:假设有三个正整数a、b、c,我们如何求得它们的最小公倍数?
 这个问题的有个简单直接的解决方法:

1.调整a、b、c的值,使得a的值最大。
2.将a和另一个正整数n相乘,判断相乘结果是否同时为b、c的倍数,如果是,则结束循环,否则,n自增后继续和a做乘法,直到相乘结果同时为b、c的倍数。(n >= 1)

 上述方法其实就是通过穷举的方式寻找出三个最小公倍数,可以,但是没必要,因为在数据量大的时候性能会很差。

 有一个数学常识大家都知道:三个正整数的最小公倍数不会大于这三个数的乘积
 也就是说,a、b、c三个数的最小公倍数最大的时候就是 a * b * c
 那么问题来了,当a、b、c满足什么条件时,它们的最小公倍数是他们的乘积呢?

 我们可以先简化这个问题——当两个正整数的值满足什么条件时,它们的最小公倍数最大?
 显然,当这两个数互质时,它们的最小公倍数最大,也就是它们的乘积

 那么在正整数个数增加到三个的时候,当他们的数值关系为两两互质的时候,它们的最小公倍数为它们的乘积。

 题目要求我们在1 ~ N之间任意选择三个数,使得它们的最小公倍数最大。
 要使得最小公倍数最大,那么思路可以是:

1.这三个数要两两互质
2.在满足1的前提下,使得三个整数取最大值

 第一点已经在上面分析过了。而第2点也很好理解,其实就是贪心策略。

算法分析

 根据N的取值的不同主要有三种情况:
 大家这么CLEVER,不大于2的情况还需要分析?

1. N为奇数时
 当N为奇数时,N - 1为偶数,N - 2为奇数,显然,数学知识告诉我们,相邻的两个正整数互质。同样的,相邻的两个奇数也是互质的,那么此时题目要求的答案为N * (N - 1) * (N - 2)

2. N为偶数时
 因为当N >3时,N 和当N - 3是可能不是互质的,例如3和6。所以偶数时又分为两种可能性:

  2.1 当3不能整除N时
    当N为偶数时,N - 2同样为偶数,那么就不能满足上面思路的第1点了。但是N和N - 1还是互质的,所以在贪
  心策略下,我们优先考虑使用更小的值去替换N - 2,而不是替换N 和 N - 1。
    经计算发现 N - 3满足要求,所以此时答案为N * (N - 1) * (N - 3)

  2.2 当3能整除N时
    因为N能够被3整除,所以N - 3同样能被3整除,为了不违反第1点,我们再次优先用更小的值替代 N - 3(为
  什么又是换掉第三个?因为我贪心啊)。
    我们先尝试使用N - 4。但是因为N是偶数,那么N - 4也是偶数,显然这也是不满足第1点的。
    我们再尝试使用N - 5。也就是N * (N - 1) * (N - 5) = n3 - 6 * n2 + 5 * n。这个也是不
  可以的,因为当N = 10时,N - 5 = 5,同样不满足第1点。【这个举例不正确,请参考下方 抹茶好喝 的评论

    ……好像有点没完没了

    所以根据贪心策略,在放弃修改最小的数(在这里是N - 3)时,我们优先考虑换掉第中间大小的数(在这里是
  N - 2)。但是会发现,无论是使用N - 3、N - 4、N - 5……中的哪一个去替换N - 2,其结果都是跟替换最小的数
  (在这里是N - 3)的结果是一样的。所以我们只能开始考虑使用更小的值去替换最大的数,也就是N。
    因为采用的是贪心策略,所以我们优先考虑使用N - 1去替换N,此时结果是:(N - 1) * (N - 2) * ( N - 3)
  显然相邻的两个正整数是互质的,我们只要考虑N - 1和N - 3是否互质就可以了。
    因为N - 1和 N - 3实际上等同于第1种情况,即N为奇数时,故 (N - 1) * (N - 2) * ( N - 3) 就是题目答案了。

C代码
#include <stdio.h>long long FindMax(long long N){long long res;       if(N <= 2)return N;if(N % 2 != 0){   //第一种情况,N为奇数时,最大最小公倍数为N * (N - 1) * (N - 2)res = N * (N - 1) * ( N - 2); }else{if(N % 3 != 0)      //第二种情况 res = N *(N - 1) * (N - 3);else                   //第三种情况 res = (N - 1) * (N - 2)* (N - 3);}return res;
}int main(){long long N;scanf("%lld",&N);printf("%lld",FindMax(N));return 0;
}

本博文参考自娜一笑最倾城

蓝桥杯——最大最小公倍数相关推荐

  1. 蓝桥杯-最大最小公倍数java语言

    蓝桥杯-最大最小公倍数java语言 开局一句话: 做这道题的时候,便没有对最小公倍数十分了解,就直接写了,也是惭愧,走了太多弯路,后来才知道,最小公倍数不是单单的几个数相乘就完了. 问题描述: 已知一 ...

  2. 蓝桥杯java最小公倍数_蓝桥杯算法训练 最大最小公倍数

    问题描述 已知一个正整数N,问从1~N中任选出三个数,他们的最小公倍数最大可以为多少. 输入格式 输入一个正整数N. 输出格式 输出一个整数,表示你找到的最小公倍数. 样例输入 9 样例输出 504 ...

  3. 蓝桥杯-5-1最小公倍数(java)

    算法训练 5-1最小公倍数 时间限制:1.0s 内存限制:256.0MB问题描述编写一函数lcm,求两个正整数的最小公倍数.样例输入一个满足题目要求的输入范例.例:3 5样例输出与上面的样例输入对应的 ...

  4. 蓝桥杯最大最小公倍数

    问题描述 已知一个正整数N,问从1~N中任选出三个数,他们的最小公倍数最大可以为多少. 输入格式 输入一个正整数N. 输出格式 输出一个整数,表示你找到的最小公倍数. 样例输入 9 样例输出 504 ...

  5. 蓝桥杯-最大最小公倍数

    package exec;import java.math.BigInteger; import java.util.Scanner;/** 问题描述 已知一个正整数N,问从1~N中任选出三个数,他们 ...

  6. 【算法练习】蓝桥杯训练一:区间k大数查询、最大最小公倍数、k好数

    蓝桥杯训练一 一.区间k大数查询(简单)(模拟) 二.最大最小公倍数(中等)(数论) 三.k好数(DP) 一.区间k大数查询(简单)(模拟) 直接模拟就可以,个人觉得题目不严谨,没有说重复元素,也没有 ...

  7. 算法练习/最小公倍数_蓝桥杯历届试题 核桃的数量

    这道题乍一看没反应过来,点了提示发现就是求三个数的最小共倍数,估计这是某一年蓝桥杯代码题的第一题. 最小公倍数的求法是:a和b的最小公倍数=a*b/a和b的最大共约数 所以变成了求最大公约数了,应用& ...

  8. 第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-2 算法训练 最大最小公倍数

    第十四届蓝桥杯集训--练习解题阶段(无序阶段)-ALGO-2 算法训练 最大最小公倍数 目录 第十四届蓝桥杯集训--练习解题阶段(无序阶段)-ALGO-2 算法训练 最大最小公倍数 前言 算法训练 最 ...

  9. 十二届蓝桥杯省赛B组C++解析(填空题部分)

    十二届蓝桥杯省赛B组C++解析(填空题部分) 目录 十二届蓝桥杯省赛B组C++解析(填空题部分) A:空间 B:卡片 C:直线 D:货物摆放 E:路径 A:空间 该题是一道计算机基础原理题,这里需要了 ...

最新文章

  1. 采用编码器-解码器匹配语义分割的图像压缩
  2. [CareerCup] 11.1 Merge Arrays 合并数组
  3. 【svn】svn的使用
  4. Candidate sampling:NCE loss和negative sample
  5. android 常用开发插件,Android Studio 开发利器【常用插件】
  6. linux 查看目录下文件个数
  7. matlab中对正弦信号采样,正弦信号抽样的实验报告(共9篇).doc
  8. 终端如何粘贴快捷键_linux shell实用快捷键
  9. select用法详解
  10. c++ 读取二进制bin文件
  11. 【sketchup 2021】草图大师的场景优化工具2【草图大师动态组件的详细使用说明和各个函数说明】【重要】
  12. android 表情包下载,表情包制作大师下载
  13. 本地差分隐私 随机响应_本地化差分隐私:如何面对非可信的世界
  14. a-upload 上传文件到阿里oss
  15. centos6和centos7的主要区别和版本选择
  16. 商业模式和盈利模式的区别是什么?
  17. Clion 2021解决中文输出乱码问题-亲测有效
  18. 2008 mysql 本地安全_apache在windows2003或win2008环境中的安全设置
  19. 用selenium模拟登录豆瓣
  20. 怎样在微信中点击app下载链接直接打开下载安卓/苹果(apk/ipa,pxl,deb)文件

热门文章

  1. 网友爆料:抖音快手严查图片商标侵权
  2. 关闭休眠功能,节省系统盘
  3. opencv 和 matplot 展示图片
  4. Python 一键吸猫!找出磁盘里所有猫照
  5. django进入admin报错ORA-00918:column ambiguously defined
  6. http,socks4,socks5代理的区别
  7. (六十四)第四章编程练习
  8. 无聊之作 对 手游十万个为什么(神之刃) 的解包分析笔记 (游戏引擎)
  9. AWVS12 安装详解 -- For Windows 10
  10. R9 7950X3D和 R9 7900X3D差距 锐龙R97950X3D和7900X3D对比