蓝桥杯 ALGO-2试题 最大最小公倍数

记录我的刷题历程

蓝桥杯 ALGO-2试题 最大最小公倍数

资源限制

时间限制:1.0s 内存限制:512.0MB

问题描述

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

输入格式

输入一个正整数N。

输出格式

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

样例输入

9

样例输出

504

数据规模与约定

1 <= N <= 106。

思路与大致想法

刚开始的想法是暴力,用三层循环去遍历,找出最大的数,最后里面有很多情况要讨论,例如出现公因数不确定性等等,思考半天都没有思路

借鉴后的思路

主要围绕着贪心算法的核心主旨:每次求最大的公因数,用最少的查找次数
因此本题的中心思想:最好是三个数相乘没有除以任何数
以奇偶数为切入点
观察可知
奇数时,n*(n-1)*(n-2)一定是最大的
原因是:两两之间相邻,所以一定是互素的(据说是数论知识,我没验证过,长见识了)
偶数时:n是偶数,n-2也一定是偶数,因此一定会有2这个公因子,所以违背贪心算法的想法,除了2之后一定会比三个质数相乘的结果要小,所以我们继续往下找
n * (n-1) * (n-3),由于n-3是奇数,所以不会和n存在公因子2的问题,但是会存在公因子3的问题
如果没有公因子3,那么最大的就是n * n-1) *(n-3)
例如:9 10 11 12,12为n时,9也是3的倍数,违背我们贪心思想,就继续往下找
n * (n-1) *(n-5),如果这个式子是成功的,那么我们可以思考
(n-1) (n-2)(n-3)和这个式子结果对比,肯定是 (n-1) (n-2)(n-3)式子大,n-1这个式子由于n-1是奇数,所以根据奇数结论,n-1这个式子就是最大的值,不需要再往下找了。

正确代码

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
	// write your code here
     Scanner scanner=new Scanner(System.in);
     long n=scanner.nextInt();
     long s=0;
     if(n%2==1){
         s=n*(n-1)*(n-2);

     }
     else {
         if(n%3==0){
             s=(n-1)*(n-2)*(n-3);
         }
         else {
             s=n*(n-1)*(n-3);
         }
     }
     System.out.println(s);
    }
}

成功截图

在这里插入图片描述

思考

感受到了数学的重要性,还有贪心算法和巧妙

借鉴来源

https://blog.csdn.net/ljd4305/article/details/21177485

更多

第一次写博客,思路也许不太清晰,仅作为个人记录学习使用,如果各位大佬们有意见和建议也可以在评论区加以指导。一起进步一起学习

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值