📌  相关文章
📜  除1和数字本身以外的数组中每个元素的最大除数(1)

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

求除1和数字本身以外的数组中每个元素的最大除数

在计算机编程中,很常见要求求出一个数除1和自己以外的最大因数,常见的做法是从2开始依次尝试能否整除该数,直到该数的一半。但是如果我们需要一次性处理一个数组中的所有数,这种暴力的方法显然效率较低。因此,我们可以利用一些数学上的性质来大幅度优化时间复杂度。本文将介绍如何通过筛法求解除1和数字本身以外的数组中每个元素的最大除数。

筛法

由于偶数除2、3、4、...、n/2都不能整除一个数n,因此我们可以把这些偶数从候选因子中排除掉。接着,我们可以将所有不能被2整除的数中的3的倍数、不能被3整除的数中的5的倍数、不能被5整除的数中的7的倍数,以此类推,用类似于线筛的方法筛掉所有的候选因子,最终留下的数就是除1和数字本身以外的最大因子。

具体实现过程如下:

  1. 初始化一个布尔类型数组prime[n+1],表示从2到n所有数字的是否是质数。其中prime[0]=prime[1]=false,其余都为true。
  2. 从2开始,遍历2到n,如果当前数字i是质数,则把所有不能被i整除的数中的i的倍数都标记为非质数。即,从i*i开始,每次加i,都标记为非质数。
  3. 遍历数组,针对每个数,找出除1和数字本身以外的最大因子,即prime数组中最后一个为true的下标。
代码实现
def get_max_divisor(num_list):
    max_num = max(num_list)
    prime = [True] * (max_num + 1)
    prime[0] = prime[1] = False
    for i in range(2, int(max_num ** 0.5) + 1):
        if prime[i]:
            for j in range(i * i, max_num + 1, i):
                prime[j] = False
    res = []
    for num in num_list:
        for i in range(num - 1, 1, -1):
            if num % i == 0 and prime[i]:
                res.append(i)
                break
        else:
            res.append(1)
    return res

以上是使用Python实现的代码。时间复杂度为O(n * log log n),其中n是输入数组的最大值,log log n表示在筛选过程中最多需要除以的因子个数。因此该算法具有良好的时间复杂度,适用于处理大规模的数据。

需要注意的是,在实际运用中,由于素数筛法不适用于负数,因此本算法处理负数时会返回1,需要在实际场景中评估一下是否合适。