资源限制
内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s
问题描述
已知一个正整数N,问从1~N中任选出三个数,他们的最小公倍数最大可以为多少。
输入格式
输入一个正整数N。
输出格式
输出一个整数,表示你找到的最小公倍数。
样例输入
9
样例输出
504
数据规模与约定
1 <= N <= 106。
思路
已知,在整数范围内:两个相邻的数必定互素;
且两个相邻的奇数必定互素
最小公倍数 = 几个数的乘积 / 他们的最大公约数
故,在小于n的数中任选3个数求其最小公倍数的最大可能取值需要分情况讨论:
(1)当n小于等于2时,最小公倍数就是它本身,即num = n
。
(2)当n大于2且为奇数时,选取小于N最大的三个数的乘积就是最大最小公倍数,即num = n * (n-1) * (n-2)
(3)当n大于2且为偶数时,n和(n-2)存在最大公约数2,如果继续使用num = n * (n-1) * (n-2)
可能导致最小公倍数的值无法取到最大,故选取与(n-1)
互素的(n-3)
,即num = n * (n-1) * (n-3)
(4)还有一种特殊情况,就是当n满足(3)但是为3的倍数时(n-3)
也是3的倍数,所以此时n和(n-3)存在最大公约数3,如果继续使用num = n * (n-1) * (n-3)
可能导致最小公倍数的值无法取到最大,如果选取与(n-4)
则可能导致结果偏小。故选择(n-2)
,即num = (n-1) * (n-2) * (n-3)
代码
# 19.最大最小公倍数
n = int(input())#输入最大数n
num = 0
if n<=2:#小于2的时候
num = n
elif n%2 == 0:#n是2的倍数的时候
if n%3 == 0:
num = (n-1) * (n-2) * (n-3)
else:
num = n * (n-1) * (n-3)
else:#n不是2的倍数时
num = n * (n-1) * (n-2)
print(num)
运行截图