整数和数学的Python内存错误
当我运行下面的代码时,我得到内存错误整数和数学的Python内存错误,python,memory,integer,Python,Memory,Integer,当我运行下面的代码时,我得到内存错误 import math X = 600851475143 halfX = math.trunc(int(X / 2)) countFactors = 0 for i in range(halfX): if i >0 and X % i: countFactors += 1 print countFactors 我理解是因为这里的数学计算,但我不知道如何纠正它 我猜您使用的是Python2.7(或者至少是2.x) 如果是这种情况
import math
X = 600851475143
halfX = math.trunc(int(X / 2))
countFactors = 0
for i in range(halfX):
if i >0 and X % i:
countFactors += 1
print countFactors
我理解是因为这里的数学计算,但我不知道如何纠正它 我猜您使用的是Python2.7(或者至少是2.x) 如果是这种情况,您应该使用
xrange
而不是range
在Python3.x中,range
创建一个迭代器,该迭代器只使用几个字节的内存,而不管它有多大。在Python2.x中,range
总是创建一个列表,其中包含在指定范围内向上(或向下)计数的数字。调用range(一些大号码)
可能会导致2.x中的内存不足
因此,Python2.x具有xrange
,它创建了一个与3.x中的range
相同的迭代器
另外,你可以简化你的数学。例如:
x = 600851475143
half_x = x // 2
count_factors = 0
for i in xrange(half_x):
if i > 0 and x % i == 0:
count_factors += 1
print count_factors
然而,有更有效的方法来做到这一点
作为一个简单的例子,如果这个数字可以被2整除,那么可以每隔一个数字迭代一次,将测试的数量减少一半。类似地,如果它可以被3,5等整除
我将把它留给你去弄清楚它的概括性。这是一个有趣的问题:)我猜您正在使用Python2.7(或者至少是2.x) 如果是这种情况,您应该使用
xrange
而不是range
在Python3.x中,range
创建一个迭代器,该迭代器只使用几个字节的内存,而不管它有多大。在Python2.x中,range
总是创建一个列表,其中包含在指定范围内向上(或向下)计数的数字。调用range(一些大号码)
可能会导致2.x中的内存不足
因此,Python2.x具有xrange
,它创建了一个与3.x中的range
相同的迭代器
另外,你可以简化你的数学。例如:
x = 600851475143
half_x = x // 2
count_factors = 0
for i in xrange(half_x):
if i > 0 and x % i == 0:
count_factors += 1
print count_factors
然而,有更有效的方法来做到这一点
作为一个简单的例子,如果这个数字可以被2整除,那么可以每隔一个数字迭代一次,将测试的数量减少一半。类似地,如果它可以被3,5等整除
我将把它留给你去弄清楚它的概括性。这是一个有趣的问题:)您使用的是python 2.x还是3.x?(
range
在您的示例中,如果使用2.x,将尝试创建一个非常大的列表)您应该使用xrange()
而不是range()
。完美。非常感谢。顺便说一句,X%i
与“X可被i整除”不是一回事。当X可被i整除时,X%i
的计算结果为零。作为一种计算因子的方法,效率非常低。为什么不将X
因子化为素数并确定素数因子的多重性?结果是1减去(m+1)的乘积,其中m的范围是素数的多重数。您使用的是python 2.x还是3.x?(range
在您的示例中,如果使用2.x,将尝试创建一个非常大的列表)您应该使用xrange()
而不是range()
。完美。非常感谢。顺便说一句,X%i
与“X可被i整除”不是一回事。当X可被i整除时,X%i
的计算结果为零。作为一种计算因子的方法,效率非常低。为什么不将X
因子化为素数并确定素数因子的多重性?结果是1减去(m+1)的乘积,其中m在素数的多重数范围内。