📌  相关文章
📜  求一个数的最大合数(1)

📅  最后修改于: 2023-12-03 15:11:02.484000             🧑  作者: Mango

求一个数的最大合数

在数论中,合数是不是质数的自然数,也就是大于 1 的非质数。求一个数的最大合数,可以通过以下方式实现。

算法思路

为了找到一个数的最大合数,我们可以从该数的最大因子开始逐渐递减,直到找到一个合数为止。

具体步骤如下:

  1. 找到该数的最大因子,可以通过循环从该数的一半开始递减直到 2,找到第一个能被该数整除的数即为该数的最大因子。

  2. 判断最大因子是否为合数,如果是,直接返回;如果不是,继续递减查找下一个数,直到找到一个合数为止。

  3. 如果该数没有合数,返回该数本身。

代码实现
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)$。