项目Euler#3 with Python(Followup)

时间:2014-06-28 16:45:13

标签: python python-3.x

我正在研究项目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)

4 个答案:

答案 0 :(得分:2)

是的,您需要注释行。

(在这种情况下似乎没有必要,但是对于其他数字,你的代码部分可能会出错)。

检查这些参考文献:

Prime numbers

Integer factorization

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