我有一个程序可以找到任何数字的素因子,n。运行它时,我得到索引错误,因为索引超出限制(限制为sqrt(n))。我不确定为什么它超出限制。任何人都可以提供任何见解吗?
我的代码适用于大多数数字:
>>> pFactors(250000)
[2, 2, 2, 2, 5, 5, 5, 5, 5, 5]
>>> pFactors(123456789)
[3, 3, 3607, 3803]
>>> pFactors(123456)
Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module>
pFactors(123456)
File "D:\my_stuff\Google Drive\Modules\factors.py", line 50, in pFactors
check = primes[index]
IndexError: list index out of range
>>> pFactors(123455)
Traceback (most recent call last):
File "<pyshell#3>", line 1, in <module>
pFactors(123455)
File "D:\my_stuff\Google Drive\Modules\factors.py", line 50, in pFactors
check = primes[index]
IndexError: list index out of range
奇怪的是,到目前为止,我发现它无法用于数字123400-1234
这是我的代码:
def pFactors(n):
import primes as p
from math import sqrt
global pFact
pFact, primes, limit, check, num, index = [], [], int(round(sqrt(n))), 2, n, 0
if type(n) != int and type(n) != long:
raise TypeError("Argument <n> can only be <type 'int'> or <type 'long'>")
else:
if p.isPrime(n):
pFact = [1, n]
else:
p.prevPrimes(limit)
for i in p.primes_dict:
if p.primes_dict[i]:
primes.append(i)
while check <= limit:
if check in primes and (num%check==0):
pFact.append(check)
num = num / check
if num in primes:
pFact.append(num)
break
else:
check = primes[index]
index += 1
return pFact
我确信问题不在于primes.py
,因为这样可行。如果有人有解决方法,请告诉我。谢谢!
答案 0 :(得分:2)
你想使用平方根的天花板作为列表长度,但你只是将它四舍五入,这意味着它有时会向下舍入。
更好的是,使用基于int的平方根函数而不是math.sqrt
,这样它对于对于双精度来说太大的数字也适用。
另外,global pFact
设计很糟糕。完全没有理由使用全局列表,除非你试图调试它或者什么东西,即使这样也是有问题的。
最后,我不确定为什么你想在素数的情况下返回1作为一个因素。这违反惯例并且与你的复合案例不一致,但我想你可以这样做,如果你真的想这样做。
无论如何,这是一个简单的分解方法。一旦你开始工作,你可以担心优化它。
def factor(x):
n = int(x)
if n < 1:
raise ValueError("Argument must be positive")
factors = []
d = 2
while d*d <= n:
while n%d == 0:
n = n // d
factors.append(d)
d += 1
if n>1:
factors.append(n)
return factors