Python 算法训练——最大最小公倍数

报名了蓝桥杯,最近在练题。第一次在CSDN上发文就记录一下解题思路叭~

如有错误,欢迎大佬指正~


题目如下:

资源限制

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

问题描述

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

输入格式

输入一个正整数N。

输出格式

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

样例输入

9

样例输出

504

数据规模与约定

1 <= N <= 106。

代码如下:

# 最大最小公倍数
n=int(input())
if n<=2:
    print(n)
elif n%2!=0:
    print(n*(n-1)*(n-2))
else:
    if n%3!=0:
        print(n*(n-1)*(n-3))
    else:
        print((n-1)*(n-2)*(n-3))

 解题思路:

1. 求最大的最小公倍数,那么应该尽可能取1~N中最大且互质的数。如果不互质的话,比如8 9 10,8和10有公因子2,那么最小公倍数肯定会缩小二倍啦~

2. 如果N为奇数,例如:5 6 7。

数学原理一:相邻的两个数一定互质,所以N与N-1、N-1与N-2一定互质;

数学原理二:相邻的奇数一定互质,所以N和N-2一定互质。

由此,这三个数两两互质。所以最大的最小公倍数为N*(N-1)*(N-2)

3. 如果N为偶数,则N与N-2同为偶数,有相同的公因子2,那么一定要改变N或者N-2。如果直接除以2,当N很大的时候,N与N/2相差太多,会大幅减小所求的最小公倍数。所以应该使用减法求与N临近的数达到两两互质的效果。

所以我们接下来的目的就是改变NN-1N-2中的NN-2

因为N更大,所以优先保留N。假如N-2变为N-3,那么三个数为N、N-1、N-3,其中N(偶数)与N-1(奇数)、N-1(奇数)与N-3(奇数)一定互质,但是N与N-3可能存在公因子3。如果N不是3的倍数,那么NN-3一定互质

因此,当N为偶数的时候,会出现两种情况:

(1)如果N不是3的倍数,那么选取N、N-1、N-3,最大的最小公倍数为N*(N-1)*(N-3)

(2)如果N是3的倍数

Ⅰ 仍减小N-2的话:

举个栗子:10 11 12,10变为9,8都不行,最大也是7,即N-5,最小公倍数为N*(N-1)*(N-5)

Ⅱ 如果减小N:

那么可以是N-1、N-2、N-3,其中N-1为奇数,一定两两互质,最小公倍数为(N-1)*(N-2)*(N-3)

比较一下这两个数的大小:

         N*(N-1)*(N-5)=(N-1)*(N*N-5*N)

         (N-1)*(N-2)*(N-3)=(N-1)*(N*N-5*N+6)

所以,最大的最小公倍数为(N-1)*(N-2)*(N-3)

(补充:关于N是偶数,但3不是因子时,N和N-3为什么互质???

首先N和N-3奇偶性不同,所以2一定不是公因子;如果N不是3的倍数,那么减3后仍旧不是,所以3一定不是公因子;如果都有公因子4,那么这两个数应该相差4的倍数,但这两者只相差了3;同理,4以上的都不会是共同的公因子。所以,这两个数互质。)

你可能感兴趣的:(python蓝桥杯,算法,python,蓝桥杯)