这是我的python代码,它在主要测试用例中适用于小值,但由于大整数值而产生Memory Error
。如何删除内存错误或如何在python中执行大整数操作?
#taking input testcases T
n=int(raw_input())
#taking value range upto iterate and find reversible numbers
_input_var = [int(raw_input()) for i in range(0,n)]
#function will reverse the number and return
def reverse(num):
return int(str(num)[::-1])
#function will check odd confirmation for every digit
def isDigitOdd(num):
lista = str(num)
for i in lista:
if int(i)%2==0:
flag = False
return flag
else:
flag = True
return flag
#main method
def main(_iter):
count=0
for i in range(0,_iter):
k = i + reverse(i)
if i%10!=0 and isDigitOdd(k):
count+=1
print count
#calling main method for N number ranges
for i in _input_var:
main(i)
答案 0 :(得分:2)
最有可能的是,当一个大数字传递给range
时,你的内存不足,因为它必须在内存中构建整个列表。将range
来电替换为xrange
。
def main(_iter):
count=0
for i in xrange(0,_iter):
k = i + reverse(i)
if i%10!=0 and isDigitOdd(k):
count+=1
print count
xrange
是一个惰性生成器,与Python 3中的range
类似,具有O(1)内存复杂性。 xrange
在64位平台上使用64位C long int
来存储内部状态,即限制几乎为±10 ^ 19(如果数字超过该限制,则会抛出OverflowError
)。无论如何,正如我在评论中已经提到的(以及其他用户),你的算法太天真,无法处理大量输入。你必须减少渐近的复杂性。像O(log(n))这样的东西就可以了。
P.S。 一些小的优化
def isDigitOdd(num):
return all(int(digit) % 2 for digit in str(num))
def main(_iter):
print(sum(i % 10 and isDigitOdd(i+reverse(i)) for i in xrange(0,_iter)))
答案 1 :(得分:0)
可能就是这条线
for i in range(0,_iter)
这将创建一个长度为_iter
的列表,对于大值,这将是大量的。实际上你不需要存储整个列表;你只需要增加一个整数。相反,使用xrange
,它会产生一个generator,它一次只能创建和存储一个整数:
for i in xrange(0,_iter)