📅  最后修改于: 2023-12-03 15:11:02.484000             🧑  作者: Mango
在数论中,合数是不是质数的自然数,也就是大于 1 的非质数。求一个数的最大合数,可以通过以下方式实现。
为了找到一个数的最大合数,我们可以从该数的最大因子开始逐渐递减,直到找到一个合数为止。
具体步骤如下:
找到该数的最大因子,可以通过循环从该数的一半开始递减直到 2,找到第一个能被该数整除的数即为该数的最大因子。
判断最大因子是否为合数,如果是,直接返回;如果不是,继续递减查找下一个数,直到找到一个合数为止。
如果该数没有合数,返回该数本身。
def max_composite(n):
# 找到最大因子
factor = n // 2
while n % factor:
factor -= 1
# 判断最大因子是否为合数,如果是直接返回
if not is_composite(factor):
factor = prev_composite(factor)
# 递减查找下一个合数
while factor > 1:
if is_composite(factor):
return factor
factor = prev_composite(factor)
# 如果没有合数,返回该数本身
return n
def is_composite(n):
if n < 2:
return False
for i in range(2, int(n**0.5)+1):
if n % i == 0:
return True
return False
def prev_composite(n):
while True:
n -= 1
if is_composite(n):
return n
assert max_composite(4) == 4
assert max_composite(7) == 6
assert max_composite(10) == 9
assert max_composite(31) == 30
assert max_composite(100) == 98
以上代码可以找到给定数字的最大合数,对给定数字 $n$,时间复杂度为 $O(\sqrt{n})$,空间复杂度为 $O(1)$。