[英]Python Prime Factors
Again im stuck on a problem.. I wanted to create a function that puts out all prim factors of a given number. 我再次陷入一个问题。.我想创建一个函数,将给定数字的所有主要因素排除在外。 It was pretty much finished but it wouldnt put out correct factors for numbers which have the same prim factor more than once, for example: 20 - 5, 2, 2 So i added a while loop which checked if the product of all factors equals the number i put in. Thanks for any help :)
它几乎完成了,但是它不会为具有相同主要因子的数字给出正确的因子,例如:20-5,2,2因此,我添加了一个while循环来检查所有因子的乘积是否等于我输入的号码。感谢您的帮助:)
prime_numbers = []
def prime_gen(upper_limit):
for i in range(2, upper_limit):
for j in range(2, i):
if i % j == 0:
break
else:
prime_numbers.append(i)
return prime_numbers
def list_product(list):
sum = 1
for i in list:
sum *= i
return sum
prime_factors = []
def prime_factor(number):
while list_product(prime_factors) != number: #without the while it checked every factor only once
for i in reversed(prime_gen(number)):
while number % i != 0:
break
else:
if i != 1:
number /= i
prime_factors.append(i)
continue
else:
break
prime_factor(20)
print (prime_factors)
Just use a for loop, getting you list of primes from prime_gen: 只需使用for循环,即可从prime_gen获取质数列表:
def prime_gen(upper_limit):
prime_numbers = [2]
for i in range(3, upper_limit,2):
for j in range(2, i):
if i % j == 0:
break
else:
prime_numbers.append(i)
return prime_numbers
def prime_factors(n):
p_f = []
for prime in prime_gen(n):
# while n is divisible keep adding the prime
while n % prime == 0:
p_f.append(prime)
# update n by dividing by the prime
n //= prime
if n > 1:
p_f.append(n)
return p_f
print(prime_factors(40))
[2, 2, 2, 5] # -> 2*2*2*5
If you take 40 as an example: 如果以40为例:
(40, 2) # first prime 2, 40 is divisible by 2
(20, 2) # 40 //= 2 == 20, 20 is divisible by 2
(10, 2) # 20 //= 2 == 10, 10 is divisible by 2
(5, 5) # 10 //=2 == 5, 5 is not evenly divisible by 2 or 3 so we get 5
If you want a fast way to generate the primes, you can use a sieve : 如果要快速生成质数,可以使用筛子 :
from math import sqrt
def sieve_of_eratosthenes(n):
primes = range(3, n + 1, 2) # primes above 2 must be odd so start at three and increase by 2
for base in xrange(len(primes)):
if primes[base] is None:
continue
if primes[base] >= sqrt(n): # stop at sqrt of n
break
for i in xrange(base + (base + 1) * primes[base], len(primes), primes[base]):
primes[i] = None
primes.insert(0,2)
sieve=filter(None, primes)
return sieve
The error you are getting ( TypeError: 'float' object cannot be interpreted as an integer
) is ultimately caused by this statement: 您收到的错误(
TypeError: 'float' object cannot be interpreted as an integer
)最终是由以下语句引起的:
number /= i
In Python 3, the result of /=
is always a float. 在Python 3中,
/=
的结果始终是浮点数。 To perform integer division (so that number
remains an integer), use: 要执行整数除法(以使
number
保持整数),请使用:
number //= i
After fixing this, you'll find that you have a logic error that causes an infinite loop. 解决此问题后,您会发现存在导致无限循环的逻辑错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.