所以我正在做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。递归会有帮助吗?我试过了,但它没有变得更漂亮(它仍然会进入无限循环的某些数字)。我现在不确定如何解决这个问题。
答案 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))