OverflowError Python int太大而无法转换为C long

时间:2014-03-01 12:02:09

标签: python python-2.7

#!/usr/bin/python
import sys,math
n = input("enter a number to find the factors   :   ")
j,flag,b= 0l,False,0l
for b in xrange(1,n+1):
    a = n + (b*b)
    j = long(math.sqrt(a))
    if a == j*j:
        flag = True
        break
if flag:
    c = j+b
    d = j-b
    print "the first factor is   :   ",c ,"  and the second factor is   :   ",d

当我运行此代码时,它会为不同的输入抛出不同类型的错误。

以下是一种输入

linux@terminal:~$ ./fermat.py
enter a number to find the factors   :   544564564545456
Traceback (most recent call last):
  File "./fermat.py", line 8, in <module>
    for b in range(1,n+1):
MemoryError

这是第二次输入

linux@terminal:~$ ./fermat.py
enter a number to find the factors   :   28888888888888888888888888888888888444444444444444444444444
Traceback (most recent call last):
  File "./fermat.py", line 8, in <module>
    for b in range(1,n+1):
OverflowError: range() result has too many items

这是第三次输出

linux@terminal:~$ ./fermat.py
enter a number to find the factors   :   28888888888888888888888888888888888444444444444444444444444
Traceback (most recent call last):
  File "./fermat.py", line 8, in <module>
    for b in xrange(1,n+1):
OverflowError: Python int too large to convert to C long

实际上我正在编写Fermat分解代码来查找给定数字的因子。我的要求是,即使给出一个数字的数字作为输入,它应该给出输入数字的输出。

有没有办法摆脱这种问题? 我正在使用Ubuntu和python 2.7.5 +

2 个答案:

答案 0 :(得分:39)

令人讨厌的是,在Python 2中,xrange要求其参数适合C long。标准库中没有完全替代品。但是,您不需要直接替换。你只需要继续循环break。这意味着您需要itertools.count,就像xrange一样,只会继续前进:

import itertools
for b in itertools.count(1):
    ...

另外,请注意您的代码有其他错误。它试图将费马分解应用于偶数,但费马分解对偶数不起作用。此外,它没有考虑n是正方形的情况,因此它不适用于n=9

答案 1 :(得分:0)

顺便说一句,如果你仍然想要一个适用于大数字的因子函数,请点击这里:

from math import sqrt
def factors(n):
return set(reduce(list.__add__,
            ([i, n//i] for i in range(1, int(sqrt(n)) + 1) if n % i == 0)))

所以现在你只需要说:

>>> factors(largenumhere)

对于一系列因素:D