项目Euler#3,分解无限循环

时间:2011-12-02 01:30:02

标签: python python-3.x primes

所以我正在做Project Euler,因为亲爱的上帝我需要练习编写代码,而且我的数学技能也很生疏,因为它非常生疏。正是如此;项目欧拉。我相信大多数人已经看到或听说过这个问题,但为了完整起见,我会把它放在这里:

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

这绝对不符合预期。遗憾的是,它正在努力解决项目欧拉问题的特殊价值,但它并不适用于100,我不确定我需要做些什么来解决这个问题:如果它是一个像100,它将正确找到前5(2 * 2 * 5),但之后将循环并设置x = 7,这将使整个事件无限循环,因为答案是2 * 2 * 5 * 5。递归会有帮助吗?我试过了,但它没有变得更漂亮(它仍然会进入无限循环的某些数字)。我现在不确定如何解决这个问题。

4 个答案:

答案 0 :(得分:2)

你的情况很好,但你需要考虑重复因素的可能性。你可以这样做:

factors = []

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

这里的想法是你要继续在因子列表中添加2,直到你测试的数字变成奇数。您可以将其他因素的类似逻辑用于增强分解方法。

答案 1 :(得分:1)

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

这是一些你应该能够变成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

答案 2 :(得分:0)

对于重复(奇数)因子,只在未找到除数时递增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

答案 3 :(得分:0)

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

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))