【问题标题】:Iterating again, prime factors loop, python再次迭代,素数循环,python
【发布时间】:2016-07-01 16:18:42
【问题描述】:

我最近在 python 中创建了一个函数,它将给出你在 python 中选择的任何数字的所有因子。我现在想修改它以仅显示主要因素。我目前拥有的功能是:

def prime_factors(n):
L = []
i = range(1, n+1)
for x in i:
    if n % x == 0:
        L.append(x)
return L

现在,为了找到质因数,我想重新遍历 L,并从 L 中删除任何数字,当它除以任何数字时,余数将为 0。

所以,本质上,我只想获取我现在拥有的列表,在我添加它之后,然后将列表中的每个值除以每个数字,直到那个数字,以确保它不能被任何东西整除余数为 0。

我试过了:

def prime_factors(n):
    L = []
    i = range(1, n+1)
    for x in i:
        if n % x == 0:
            L.append(x)
    for y in L:
        for x in i:
            if y % x == 0:
                L.remove(y)
    return L

另外,我尝试将它分成 2 个不同的功能...

def prime_factors(n):
    L = []
    i = range(2, n)
        for x in i:
            if n % x == 0:
                L.append(x)
    return L

def prime(n):
     L = prime_factors(n)
     i = range(2, n)
         for y in L:
            for x in i:
                if x % y == 0:
                    L.remove(x)
     return L

我试过将返回值放在不同的地方,我试过翻转循环的顺序,无论如何,我不知道如何通过另一个检查来运行列表 L 以查看其中的值能被0整除...

【问题讨论】:

  • 因子列表的初始代码可以使用更短的循环。每次你找到一个因子x,你也找到了第二个因子n / x。您可以将两者都添加到列表中。这将循环的上限减半。如果您希望这些因素按顺序排列,请在最后对列表进行排序。

标签: python loops python-3.x primes


【解决方案1】:

修改你的 prime_factors 函数如下:

def prime_factors(n):
    L = []
    i = range(2, n+1)  # start from 2 as it is the first prime
    for x in i:
        if n % x == 0:
            L.append(x)
            # loop added
            while n%x == 0:
                n = n/x
        # break as no further factors are possible
        if n == 1:
            break
    return L

现在,while n%x == 0 所做的是,它从原始数字中移除了某个因子的幂。

例如,
n = 24 = 2*2*2*3 n%2 == 0,所以 L = [2] 并且 n 变为 3 [这确保非素数的 4 或 8 不会附加到 L]

【讨论】:

    【解决方案2】:

    你可以简单地使用一个返回真/假素数的函数

    import math
    def is_prime(n):
        if n % 2 == 0 and n > 2: 
            return False
        return all(n % i for i in range(3, int(math.sqrt(n)) + 1, 2))
    
    def prime_factors(n):
        L = []
        i = range(1, n+1)
        for x in i:
            if n % x == 0:
                if is_prime(x):
                    L.append(x)
        return L
    

    【讨论】:

    • 如果我只是想修改上面的代码,我该怎么做呢?我真的很想通过从因素列表中删除非素数来做到这一点。另外,根据我已有的代码,我理解得更好。