Python 项目Euler#3,因式分解的无限循环
所以我在做Euler项目,因为亲爱的上帝,我需要练习写代码,而且我的数学技能已经生锈了。如此;欧拉计划。我相信这里的大多数人已经看到或听说过这个问题,但为了完整起见,我将把它放在这里: 13195的主要因子为5、7、13和29。 数字600851475143中最大的素因子是什么 为此,我编写了两个函数: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:
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的因子除以了!