Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.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 int太大,无法转换为C long_Python_Python 2.7 - Fatal编程技术网

溢出错误Python int太大,无法转换为C long

溢出错误Python int太大,无法转换为C long,python,python-2.7,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 = T

当我运行这段代码时,它会针对不同的输入抛出不同类型的错误

以下是一种输入

#!/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
输入一个数字以查找系数:54456456
回溯(最近一次呼叫最后一次):
文件“/fermat.py”,第8行,在
对于范围(1,n+1)内的b:
记忆者
这是第二次输入

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
输入一个数字以查找系数:28888888888888888888888888888884444444444
回溯(最近一次呼叫最后一次):
文件“/fermat.py”,第8行,在
对于范围(1,n+1)内的b:
OverflowerError:range()结果的项太多
这是第三次输出

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
输入一个数字以查找系数:28888888888888888888888888888884444444444
回溯(最近一次呼叫最后一次):
文件“/fermat.py”,第8行,在
对于X范围内的b(1,n+1):
溢出错误:Python int太大,无法转换为C long
实际上,我是在为费马分解编写代码,以找到给定数字的因子。我的要求是,即使输入一个百位数字,它也应该给出该输入数字的输出

有没有办法解决这种问题?
我正在将Ubuntu与Python2.7.5+一起使用,令人恼火的是,在Python2中,
xrange
要求它的参数适合C long。标准库中的替换率并没有下降。然而,你并不需要一个替代品。您只需继续运行,直到循环
break
s。这意味着您需要,就像一个持续运行的
xrange

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

另外,请注意,您的代码还有其他bug。它试图将费马分解应用于偶数,但费马分解不适用于偶数。另外,它不能考虑<代码> n</代码>为正方形的情况,因此对于<代码> n=9 不适用。

btw,如果你仍然想要一个与大数一起工作的因子函数,在这里:

import itertools
for b in itertools.count(1):
    ...
所以现在你只需要说:

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)))

对于大量的因素:D

您的前两个回溯是针对您没有发布的代码;您使用的是
range()
而不是
xrange()
,生成的列表中元素太多。在任何情况下,都不应该尝试为如此巨大的因素生成循环。无论如何,你的代码永远不会在合理的时间内完成。你从哪里看出有必要首先创建这样的循环?你不能对偶数使用费马分解。
>>> factors(largenumhere)