在Python中查找第一个百万自然数的乘积
我刚刚开始学习Python编程语言。我试着写一个函数,输入一个列表或多个整数来找到它们的乘积。我试图找到第一个一百万个自然数的乘积,但它显示了一个在Python中查找第一个百万自然数的乘积,python,python-3.x,list,function,out-of-memory,Python,Python 3.x,List,Function,Out Of Memory,我刚刚开始学习Python编程语言。我试着写一个函数,输入一个列表或多个整数来找到它们的乘积。我试图找到第一个一百万个自然数的乘积,但它显示了一个MemoryError def product(*arg): answer=1 if type(arg) == tuple: arg=str(arg) arg=arg.lstrip('[(') arg=arg.rstrip('],)') arg=arg.split(',')
MemoryError
def product(*arg):
answer=1
if type(arg) == tuple:
arg=str(arg)
arg=arg.lstrip('[(')
arg=arg.rstrip('],)')
arg=arg.split(',')
for i in arg:
answer*=int(i)
return answer
else:
for i in arg:
answer*=int(i)
return answer
j=range(1,1000000,1)
j=list(j)
print(product(j))
步骤:
- 如果要传递列表,则将范围对象转换为列表对象 论据
- 现在,在函数中,我尝试通过转换元组来拆分元组 绳子
- 我将结果字符串转换为一个列表,然后在 元素来查找产品
Q2如何改进此代码?要计算100万到100万之间所有数字的乘积,请使用一个简单的循环:
r = 1
for l in range(1,1000000):
r*=(i+1)
print(res)
但请记住,结果将是一个相当大的数字。
这意味着您的计算可能需要很长时间,结果数字将需要大量内存
编辑然后我有点误读了你的问题。这是一个将列表中的元素相乘的函数:
def multiply_list_elements(_list):
result = 1
for element in _list:
result*=element
return result
multiply_list_elements([1,2,3,4])
>>> 24
内存错误可能来自于@ZabirAlNazi计算得很好的巨大数字。要计算100万到100万之间所有数字的乘积,请使用一个简单的循环:
r = 1
for l in range(1,1000000):
r*=(i+1)
print(res)
但请记住,结果将是一个相当大的数字。
这意味着您的计算可能需要很长时间,结果数字将需要大量内存
编辑然后我有点误读了你的问题。这是一个将列表中的元素相乘的函数:
def multiply_list_elements(_list):
result = 1
for element in _list:
result*=element
return result
multiply_list_elements([1,2,3,4])
>>> 24
内存错误可能来自于@ZabirAlNazi计算得非常好的巨大数字。您可以在Python中使用
def generate_product():
r = 1
for i in range(1,1000000):
r *= i + 1
yield r
list(generate_product())[0]
它的内存效率更高,性能也更好 您可以在Python中使用
def generate_product():
r = 1
for i in range(1,1000000):
r *= i + 1
yield r
list(generate_product())[0]
它的内存效率更高,性能也更好 所有的解决方案都很好,但有一点需要说明——你的问题相当于找到一百万的阶乘 n的位数!=log10(1)+log10(2)+。。。日志10(n) 因此,您的答案中的位数是
5565703
(大约)
这只是最后的n
,如果您还需要中间结果,则需要平方内存O(m^2)
注意:你可以用对数和斯特林数进行近似运算,运算速度更快。所有的解决方案都很好,但有一点需要说明——你的问题相当于找到一百万的阶乘 n的位数!=log10(1)+log10(2)+。。。日志10(n) 因此,您的答案中的位数是
5565703
(大约)
这只是最后的n
,如果您还需要中间结果,则需要平方内存O(m^2)
注意:您可以使用对数和斯特林数进行近似计算,运行速度更快。一个非常简单的解决方案是:
def prod_of():
p=1
for i in range(1,1000000):
p* = i
print(p)
一个非常简单的解决方案是:
def prod_of():
p=1
for i in range(1,1000000):
p* = i
print(p)
究竟为什么要将元组转换为字符串并返回,而不是像else语句中那样直接迭代?当我传递arg参数时,它会转换为一个元素化的元组。因此,我无法迭代它。请尝试
for i in arg[0]:
谢谢,arg[0]
的工作方式使我可以直接在其上循环。但是关于寻找百万数字乘积的问题仍然存在。对于较小的数字:math.factorial(1000)
(reduce(mul,range(11000+1))
)但是对于1000\u 000
来说,答案太大了:你可能会问,你到底为什么要将元组转换成字符串并返回,而不是像在else语句中那样直接迭代呢?当我传递arg参数时,它会被转换成单个元素元组。因此,我无法迭代它。请尝试在arg[0]中输入i:
然后谢谢,arg[0]
的工作方式是我可以直接在它上面循环。但是寻找百万数字乘积的问题仍然存在。对于较小的数字:math.factorial(1000)
(reduce(mul,range(1,1000+1))
)但是对于1000\u 000
,答案太大了:谢谢。但是我试图创建一个函数,在这个函数中,我输入任何数字列表,然后得到产品。我提到了前一百万个数字,因为在测试我的函数时,它显示了一个内存错误。谢谢。但是我试图创建一个函数,在这个函数中,我输入任何数字列表,然后得到产品。我提到了前一百万个数字,因为在测试我的函数时,它显示了一个内存错误。