我正在研究项目euler上的问题#3,我遇到了一个问题。程序似乎正在将所有项目从factors
复制到prime_factors
,而不仅仅是素数。我认为这是因为我的is_prime
功能无法正常工作。如何让功能完成我想要的功能?此外,在代码中,有一行我注释掉了。我需要那条线,还是没必要?最后,代码是整个声音(is_prime
除外),还是有问题?
项目的欧拉问题是:13195的主要因素是5,7,13和29. 600851475143的最大素数因素是什么?
指向同一主题的我之前的问题的链接:https://stackoverflow.com/questions/24462105/project-euler-3-python?noredirect=1#comment37857323_24462105
感谢
import math
factors = []
prime_factors = []
def is_prime (x):
counter = 0
if x == 1:
return False
elif x == 2:
return True
for item in range (2, int(x)):
if int(x) % item == 0:
return False
else:
return True
number = int(input("Enter a number: "))
start = int(math.sqrt(number))
for item in range(2, start + 1):
if number % item == 0:
factors.append(item)
#factors.append(number/item) do i need this line?
for item in factors:
if is_prime(item) == True:
prime_factors.append(item)
print(prime_factors)
答案 0 :(得分:2)
是的,您需要注释行。
(在这种情况下似乎没有必要,但是对于其他数字,你的代码部分可能会出错)。
检查这些参考文献:
Why do we check up to the square root of a prime number to determine if it is prime or not
我的计算机上得到了一个非常快速的结果,代码如下:
#!/usr/bin/env python
import math
def square_root_as_int(x):
return int(math.sqrt(x))
def is_prime(number):
if number == 1:
return False
for x in range(2, square_root_as_int(number) + 1):
if x == number:
next
if number % x == 0:
return False
return True
def factors_of_(number):
factors = []
for x in range(2, square_root_as_int(number) + 1):
if number % x == 0:
factors.append(x)
factors.append(number/x)
return factors
factors = factors_of_(600851475143)
primes = []
for factor in factors:
if is_prime(factor):
primes.append(factor)
print max(primes)
# Bonus: "functional way"
print max(filter(lambda x: is_prime(x), factors_of_(600851475143)))
答案 1 :(得分:1)
您的is_prime()
提前退货。这是一个固定版本:
def is_prime (x):
if x == 1:
return False
if x == 2:
return True
for item in range (2, int(x)):
if int(x) % item == 0:
return False
return True
答案 2 :(得分:1)
你不应该以你现在的方式使用int(x)
。我知道你强制int
类型,因为你想从字符串输入转换,但这也允许用户输入一个浮点数(十进制),并将其解释为素数或不是。这是函数的不良行为。看下面我的解决方案。如果您使用eval
验证输入,则可以稍后使用x
代替int(x)
。
import math
factors = []
prime_factors = []
def is_prime (x):
x = eval(x) # this will cause a string like '5' to be evaluated as an integer.
# '5.2' will be evaluated as a float, on the other hand.
if type(x) != int:
raise Exception('Please enter an integer.') #prevents bad input
counter = 0 #this counter is not used. why is it initialized here?
if x == 1:
return False
elif x == 2:
return True
for item in range (2, x):
if x % item == 0:
return False
else:
return True
答案 3 :(得分:0)
使用while循环。 n%我只是指n%i!= 0
i = 2
n = 600851475143
while i*i <= n:
if n%i:
i+=1
else:
n //= i
print n