我必须编写能找到素数因子的代码。另外,我必须记住多次出现的因素。对于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。任何人都可以帮忙吗?我应该使用循环和列表。
提前致谢。
晒
答案 0 :(得分:1)
保持简单和愚蠢通常更好(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中使用//
进行整数除法。
答案 1 :(得分:0)
首先,您应该从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
正如你所说,这给了你所有的主要因素,现在我们只想复制(或进一步)如果适用:
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)
答案 2 :(得分:0)
我是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
答案 3 :(得分:0)
这是一个如何使用递归和海象算子求素因数的例子
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]