[英]Find multiple prime factors Python
我必須編寫代碼來查找主要因素。 另外,我必須記住多次出現的因素。 對於 12,我知道如何編寫返回 3 和 2 的代碼。
def prime_factors(n):
for possible_prime in range(2,int(math.sqrt(n)+1)):
redundant=n%possible_prime
if redundant==0:
for last_check in range(2,int(math.sqrt(possible_prime)+1)):
redundant2=possible_prime%last_check
if redundant2!=0:
print(possible_prime)
但我需要得到的是 2, 2, 3。有人可以幫忙嗎? 我應該使用循環和列表。
提前致謝。
沙伊
保持簡單和愚蠢通常更好(KISS 原則)。 雖然有更有效的算法來進行質因數分解,但這個算法很簡單:
import math
def prime_factors(n):
res = []
# handle factors 2 first
while n%2 == 0:
res.append(2)
n = n//2
fac = 3
# handle all odd factors until limit reached
while fac < int(math.sqrt(n))+1:
while n%fac == 0:
res.append(fac)
n = n//fac
fac += 2
# append remaining prime factor
if n > 2:
res.append(n)
return res
print (prime_factors(2222222222))
注意在 Python 3 中使用//
進行整數除法。
首先,您應該從range()
刪除所有偶數以優化循環,我還建議在 sqrt 的整數形式中添加一個以保持類型一致。 第二個循環也沒有優化,因為每次第一個循環導致redundant == 0
,可能的素數要么是素數,要么是已經找到的引物因子的組合,從而減少了您需要檢查的數字數量
def prime_factors(n):
factors = []
for possible_prime in [2] + range(3, int(math.sqrt(n))+1, 2):
if not (n % possible_prime):
limit = int(math.sqrt(possible_prime)
is_prime = True
for factor in factors:
if factor > limit:
break
if not (possible_prime % factor):
is_prime = False
break
if is_prime:
factors.append(possible_prime)
return factors
正如您所說,這為您提供了所有主要因素,現在我們只想復制(或進一步)如果 apropiate:
def prime_factors(n):
factors = []
for possible_prime in [2] + range(3, int(math.sqrt(n))+1, 2):
if not (n % possible_prime):
limit = int(math.sqrt(possible_prime)
is_prime = True
for factor in factors:
if factor > limit:
break
if not (possible_prime % factor):
is_prime = False
break
if is_prime:
factors.append(possible_prime)
factors_copy = factors[:]
for factor in factors_copy:
i = 0
j = n
while not(j % factor):
i += 1
j /= factor
for k in range(i-1):
factors.append(factor)
return sorted(factors)
我是 Python 新手,但會嘗試一下(如果 synthax 不完美,請糾正我)
def prime_factors(n):
prime_list = []
job_done = False
first_prime = 2
while not job_done:
for possible_prime in range(first_prime,n+1):
if n%possible_prime == 0:
prime_list.append(possible_prime)
first_prime = possible_prime
n = int(n/possible_prime)
if n == 1:
job_done = True
break
return prime_list
這是一個如何使用遞歸和海象算子找到素因數的例子
def prime_factors(n):
for i in range(2, int(n ** 0.5) + 1):
if (q_r := divmod(n, i))[1] == 0:
return [i] + factor_list(q_r[0])
return [n]
>>> prime_factors(12)
[2, 2, 3]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.