【问题标题】:Problem with python code for finding largest prime factor of a number (Project Euler problem 3)用于查找数字的最大素数的 python 代码问题(Project Euler 问题 3)
【发布时间】:2019-09-29 09:18:34
【问题描述】:

我目前正在尝试使用 python 解决Project Euler problem 3,它试图找到一个数字的最大素数。我使用的方法本质上是蛮力通过每个小于所讨论整数的整数,检查它是否是所述整数的因子,然后检查它是否是素数。但是,由于某种原因,我的代码似乎无法正常工作。

我尝试使用创建一个函数,该函数遍历小于给定整数 (n) 的每个整数 (i),如果 i 可被 n 整除,则该函数继续检查 i 是否为素数遍历每个小于或等于 i (x) 的整数。如果 x 是 i 的因子,则将该值添加到定义为 (a) 的零整数。之后,如果 a 最终与 i + 1 相加,则意味着该因子是素数,因为唯一可整除的数字是它自己和 1。代码如下:

def primefactor(n):
    for i in range(1, n+1): #goes through each integer less than n
        if n % i == 0: #checks if integer is a factor
            for x in range(1, i+1):  #another loop to check if the factor is prime
                a = 0
                primenumbers = []
                if i % x == 0:
                    a += x
                if a == i + 1:
                    primenumbers.append(i)
    print(primenumbers)

primefactor(13195)

我期望的输出是它打印一个数字的所有主要因素的列表,在这种情况下,[5, 7, 13, 29],但相反,我得到的只是一个空列表,[]

【问题讨论】:

  • primenumbers = [] 你把primenumbers 在每个循环上变成一个空列表......

标签: python prime-factoring


【解决方案1】:

您的代码的这个问题是您将 primenumbers 分配给一个空列表,每次迭代使用 primenumbers = []

此外,如果您不想强行使用它,解决此类解决方案的一个好方法是在谷歌上搜索Formula for primes 等公式,您会发现:

根据威尔逊定理,n+1 是素数当且仅当n! mod(n + 1) = n

所以你可以这样做:

# This is just used as caching to make it faster
# it is not needed.
from functools import lru_cache
from math import factorial

@lru_cache()
def isprime(x):
    n = x - 1
    if n == factorial(n) % (n + 1):
        return True
    else:
        return False

def primefactor(n):
    primenumbers = []
    for i in range(1, n + 1): #goes through each integer less than n
        if n % i == 0: #checks if integer is a factor
            isprime(i) and primenumbers.append(i)
    print(primenumbers)

primefactor(13195)

输出:

[1, 5, 7, 13, 29]

还有比这个更快的解决方案,它确实会遍历所有数字 0 到 nAlgorithm to find Largest prime factor of a number

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-11
    • 2010-09-17
    • 2020-03-17
    • 1970-01-01
    • 1970-01-01
    • 2019-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多