Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 项目Euler#3,因式分解的无限循环_Python_Python 3.x_Primes - Fatal编程技术网

Python 项目Euler#3,因式分解的无限循环

Python 项目Euler#3,因式分解的无限循环,python,python-3.x,primes,Python,Python 3.x,Primes,所以我在做Euler项目,因为亲爱的上帝,我需要练习写代码,而且我的数学技能已经生锈了。如此;欧拉计划。我相信这里的大多数人已经看到或听说过这个问题,但为了完整起见,我将把它放在这里: 13195的主要因子为5、7、13和29。 数字600851475143中最大的素因子是什么 为此,我编写了两个函数: from math import sqrt def isprime(n): if n == 1: return False elif n == 2:

所以我在做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

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

您的工作进展顺利,但您需要考虑重复因素的可能性。您可以通过以下方式实现:

factors = []

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

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

您的思路很好,但您需要考虑重复因素的可能性。您可以通过以下方式实现:

factors = []

while num % 2 == 0:
  factors.append(2)
  num /= 2
这里的想法是,你将继续在因子列表中添加2,直到你测试的数字变为奇数。您也可以对其他因子使用类似的逻辑来增强您的因子分解方法。

对于重复(奇数)因子,在未找到因子时只需增加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
奥托斯,你似乎总是忽略了“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
对于重复(奇数)因子,在未找到除数时仅增加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
奥托斯,你似乎总是忽略了“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

我认为你把问题弄得太复杂了

下面是一些伪代码,您应该能够将其转换为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

我认为你把问题弄得太复杂了

下面是一些伪代码,您应该能够将其转换为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

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

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))
导入数学
def find_prime(num):

如果num这里是另一个优化的解决方案:

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))
导入数学
def find_prime(num):

如果num I感到困惑,那么
n=n
应该怎么做?您也从来没有给
n
@slugonamission//赋值,它不是python中的注释,而是int除法。n=n/x会导致一个浮点,//会导致一个intOh是的,对不起(我的Python有点生疏)。您如何使用factoriation()函数?它应该返回什么?我为Euler-3编写的一个是递归的,返回一个素因子列表。为了使SO语法更清晰,您可以使用
n//=x
我很困惑,
n=n
应该怎么做?您也从来没有给
n
@slugonamission//赋值,它不是python中的注释,而是int除法。n=n/x会导致一个浮点,//会导致一个intOh是的,对不起(我的Python有点生疏)。您如何使用factoriation()函数?它应该返回什么?我为Euler-3编写的是递归的,返回一个素数因子列表。为了使SO语法更清晰,您可以使用
n//=x
,顺便说一下,您根本不需要
isprime()
测试。如果您将除数从2检查到所需的除数,则可以保证无论何时
n%x==0
x都是素数。如果不是,n早就应该被x的因子除以了!顺便说一下,您根本不需要
isprime()
测试。如果您将除数从2检查到所需的除数,则可以保证无论何时
n%x==0
x都是素数。如果不是,n早就应该被x的因子除以了!