【问题标题】:Project Euler #3, infinite loop on factorizationProject Euler #3,因式分解的无限循环
【发布时间】:2011-12-02 01:30:01
【问题描述】:

所以我正在做欧拉计划,因为亲爱的上帝,我需要练习编写代码,而且我的数学技能已经生锈了。因此;欧拉计划。我相信这里的大多数人已经看到或听说过这个问题,但为了完整起见,我将其放在这里:

13195 的质因数是 5、7、13 和 29。 600851475143这个数的最大质因数是多少?

为此,我编写了两个函数:

from math import sqrt

def isprime(n):
    if n == 1:
        return False
    elif n == 2:
        return True
    elif n % 2 == 0:
        return False
    for x in range(3, round(sqrt(n))+1, 2):
        if n % x == 0:
            return False
    else:
        return True

这只是检查任何馈送数的素数。它按预期工作(据我所知),但现在我已经说过我不确定了。无论如何,它首先检查特殊情况:1(从不素数)、2(素数)或者它是否可以被 2 整除(不是素数)。如果没有任何特殊情况发生,它会运行一般素数测试。

这是我的分解代码:

def factorization(n):
   factor = 2
   x = 3
   while True:
       if n % x == 0:
           if isprime(x):
               factor = x
               n = n // x
               if n == 1:
                   return factor
           else:
               return factor
       x += 2

这绝对不是按预期工作的。可悲的是,它正在为 Project Euler 问题的特定值工作,但它不适用于 100。我不确定我需要做什么来解决这个问题:如果它是一个像这样的数字,会发生什么100,它会正确找到前 5 个(2*2*5),但之后会循环并设置 x = 7,这将使整个事物无限循环,因为答案是 2*2*5*5。递归在这里有帮助吗?我试过了,但它并没有变得更漂亮(对于某些数字,它仍然会进入无限循环)。我现在不确定如何解决这个问题。

【问题讨论】:

  • 我很困惑,n = n 应该做什么?你也从来没有给n分配任何东西。
  • @slugonamission // 在 python 中不是注释,它是 int 除法。 n = n / x 将产生一个浮点数,// 产生一个 int
  • 哦,是的,抱歉(我的 Python 有点生锈了)。
  • 你是如何使用 factorization() 函数的?它应该返回什么?我为 Euler-3 写的那个是递归的,它返回一个素因子列表。
  • 为了更加混淆 SO 语法高亮,您可以使用 n//=x

标签: python python-3.x primes


【解决方案1】:

您的工作进展顺利,但您需要考虑重复因素的可能性。你可以这样做:

factors = []

while num % 2 == 0:
  factors.append(2)
  num /= 2

这里的想法是您将继续将 2 添加到因子列表中,直到您正在测试的数字变为奇数。您也可以对其他因子使用类似的逻辑来增强分解方法。

【讨论】:

    【解决方案2】:

    我认为您使问题变得比必要的复杂

    这里有一些伪代码,你应该可以将它们转换成 Python 代码

    from itertools import count
    n=600851475143  
    for x in count(2):
        while x divides n:
            divide n by x
        if n==1:
            print x # largest factor will be the last one
            break
    

    【讨论】:

      【解决方案3】:

      对于重复(奇数)因子,当没有找到除数时增加 x:

      def factorization(n):
          factor = 2
          x = 3
          while True:
              if n % x == 0:
                  if isprime(x):
                      factor = x
                      n = n // x
                      if n == 1:
                          return factor
                  else:
                      return factor
              else:
                  x += 2
      

      OTOS,您似乎总是错过“2”因素。把它们粘在上面,然后做主循环

      编辑(评论后)

      你可以做一个更简单的:

      def factorization(n):
          factors = []
          x = 2
          while True:
              while n % x == 0:
                  factors.push(x)
                  n /= x
              if n == 1:
                  return factors
              if x == 2:
                  x = 3
              else: 
                  x += 2
      

      【讨论】:

      • 顺便说一句,你根本不需要isprime() 测试。如果您检查从 2 到所需的除数,则可以保证每当 n % x == 0 时 x 是素数。如果不是,n 早就应该除以 x 的因数了!
      【解决方案4】:

      这是另一个优化的解决方案:

      import math
      
      def find_prime(num):
          if num <= 1:
              return False
          elif(num == 2):
              return True
          elif( num % 2 == 0):
              return False
          for i in range(3, int(math.sqrt(num))+1, 2): 
              if num%i == 0:
                  return False 
          return True
      
      def prime_factor(number):
          pf = number;
          divList = [];
      
          for i in range(2, int(math.sqrt(number))):
              if number % i == 0 :
                  divList.append(i)
      
          for n in divList:
              if(find_prime(n)):
                  pf = n;
      
          return pf
      
      num = 600851475143
      print("Max prime factor :", prime_factor(num))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-07-26
        • 2015-12-25
        • 1970-01-01
        • 1970-01-01
        • 2019-11-13
        • 2011-02-15
        • 1970-01-01
        相关资源
        最近更新 更多