我是一个完整的编码初学者,所以我认为通过解决项目欧拉问题我可以变得更好,我被困在问题3上。
" 13195的主要因素是5,7,13和29。 数字600851475143的最大主要因素是什么?"
我的代码适用于较小的数字示例,但是当我尝试较大的代码时,它需要永远运行,如何才能使代码更高效?
n=3 #factors
l=[]
flag = True
while(n<600851475143):
a=3
if (600851475143%n==0):
while(a<n):
if n%a!=0:
a+=2
else:
flag = False
break
if(flag):
l.append(n)
n+=2
print(l[len(l)-1])
答案 0 :(得分:2)
您可以采取一些措施来加快此代码的速度。 首先是更多地了解数学和素数的一些属性。
Why do we check up to the square root of a prime number to determine if it is prime or not
另一件事是(至少对我而言),你的代码真的难以阅读......试着让你的意图更清晰。
我尝试在python中提出一个解决方案,并在我的计算机上运行0.15s
。
#!/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 :(得分:0)
你也可以使用generators,这对我有用。
以下是一个例子:
# Set variables
number = 600851475143
primeFactorList = []
def primeList(number):
# Make list of prime numbers < 'number'
for x in range(2, number+1):
isPrime = True
# Don't calculate for more than the sqrt of number for efficiency
for y in range(2, int(x**0.5)+1):
if x % y == 0:
isPrime = False
break
if isPrime:
yield x
# Calculate primes using primeList and check for prime factors of 'number'
for i in primeList(number):
if i > number**0.5:
break
if number % i == 0:
primeFactorList.append(i)
# Print largest prime factor of 'number'
print(max(primeFactorList))