我正在尝试使用Python找到给定数字(600851475143)的最大素数因子。我已经制作了以下代码,但我不知道出了什么问题以及我是否使用了正确的代码请帮助找出我的错误并进行改进。
import math
def t(x):
l=[]
for i in range(1,int(math.sqrt(x))):
if x%i==0:
l.append(i)
return l
def check(y):
for i in range(2,1+y/2):
if y%i==0:
return 'this is not prime'
return 'ya'
print t(600851475143)
print check(486847)
答案 0 :(得分:2)
您需要检查您添加到列表中的所有内容实际上是否为
for i in range(1,int(math.sqrt(x))):
if (x % i) != 0:
continue
if check(i):
l.append(i)
然后,弹出列表的最后一个(最大)元素:
return l.pop()
您还可以查看平方根:
def check(y):
for i in range(2,int(math.sqrt(y))):
if (y % i) == 0:
return False
return True
这是一个稍微修改过的版本,向后迭代(如pzp所示),并在找到素数后立即返回:
#!/usr/bin/env python
import math
def t(x):
for i in xrange(int(math.sqrt(x)), 1, -1):
if (x % i) != 0:
continue
if check(i):
return i
return None
def check(y):
for i in range(2, int(math.sqrt(y))):
if (y % i) == 0:
return False
return True
print t(600851475143)
print check(6857)
答案 1 :(得分:0)
你非常接近。您的check()
会在您想要之前返回。你想要:
def check(y):
for i in range(2,1+y/2):
if y%i==0:
return 'this is not prime'
return 'ya'
这将等到你检查所有数字<返回false之前y
。现在,它检查2,然后返回true或false。
同样t()
正在返回所有因素,而不是最大因素。对于最大因素(假设有一个),您需要return l[-1]
修改强>
好吧,我想我得到了你想要的东西。通过使用此t()
和check()
,您可以获得最大的素数:
def t(x):
l=[]
for i in range(1,int(math.sqrt(x))):
if x%i==0:
l.append(i)
return l
#Notice, return list of all factors
def check(y):
for i in range(2,1+y/2):
if y%i==0:
return False
return True
number_to_check = 92873465
prime_factors = []
for factor in t(number_to_check): # Iterate through factors returned from t()
if check(factor):
prime_factors.append(factor)
print "Largest Prime Factor: " + prime_factors[-1]