簡體   English   中英

尋找一個數的最大素因數的python代碼問題(Project Euler問題3)

[英]Problem with python code for finding largest prime factor of a number (Project Euler problem 3)

我目前正在嘗試使用 python 解決Project Euler 問題 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分配給一個空列表。

此外,如果您不想強制使用它,解決此類解決方案的一個好方法是在谷歌上搜索一個公式,例如質數公式,您會發現:

根據威爾遜定理, n+1是素數當且僅當n! mod(n + 1) = n 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 到n找到數字的最大素因數的算法

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM