为什么我不能使用这个python文件获得素数?

时间:2014-08-27 05:41:06

标签: python math

我是python的初学者,我在项目euler上遇到问题,要求我找到最大的素数。但是我的代码没有像我预期的那样工作,而且我得到的数字并不是一个素数。虽然我已经做了很长时间,但我仍然找不到问题。我的代码是

def is_prime(x):
  for i in range(2,x):
    if x%i==0:
        return False
    else:
        return True
def largest_prime_factor(x):
  a=range(1,x)
  list1=[]
  for i in a:
    if x%i==0 and is_prime(i) == True:
        list1.append(i)
  print max(list1)

这里的任何人都可以告诉我为什么我的代码错了?提前谢谢你

3 个答案:

答案 0 :(得分:2)

代码中有三个错误。一,已经指出:你应该在return True的循环结束时is_prime。另一个是1不是素数:

def is_prime(x):
   if x == 1:
       # 1 is not prime!
       return False

   # you can loop up to ceil(sqrt(x)) instead of all the way up to x
   for i in range(2, int(x**.5) + 1):
      if x%i==0:
          return False
      elif i > x:
          break   
   return True

另一个是largest_prime_factor引发了素数的错误:

In [7]: largest_prime_factor(7)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-7-eceaf4811bfe> in <module>()
----> 1 largest_prime_factor(7)

<ipython-input-6-d40692628493> in largest_prime_factor(x)
     12     if x%i==0 and is_prime(i):
     13         list1.append(i)
---> 14   return max(list1)

ValueError: max() arg is an empty sequence

(如果您使用1认为is_prime是素数的1的错误版本,则返回range(1, x)

问题是x不包含largest_prime_factor。因此,当x为素数时,x中的循环将无法将x添加为因子。您应该遍历包含def largest_prime_factor(x): list1=[] for i in range(1, x+1): if x%i==0 and is_prime(i): list1.append(i) return max(list1) 的范围:

sqrt(x)

然而,这是非常低效的。相反,您可以像is_prime一样循环到x,但是当您找到一个因子时,您可以划分from itertools import chain def largest_prime_factor(x): factors = [] for div in chain([2], range(3, int(x**.5) + 1, 2)): while x % div == 0: factors.append(div) x //= div if div > x: break if x != 1: # return x # should be okay to do this because x was prime factors.append(x) return max(factors)

sqrt(x)

这样效率更高,因为它必须只循环到In [11]: largest_prime_factor(7) Out[11]: 7 ,并返回正确的结果:

{{1}}

答案 1 :(得分:0)

问题在于您的is_prime(x)。它返回函数调用的第一个实例。因此,您可能希望将其存储为布尔值或执行某些返回逻辑,而不是返回TrueFalse。它可能看起来像这样:

if x%i==0:
    continue
else:
    return False

然后在函数末尾返回True,如果它到达那里。

答案 2 :(得分:0)

在循环中,只应该返回false,当尝试所有步骤时返回true。

def is_prime(x):
  for i in range(2,x):
    if x%i==0:
        return False   
  return True

def largest_prime_factor(x):
  a=range(1,x)
  list1=[]
  for i in a:
    if is_prime(i):
        list1.append(i)
  print max(list1)