我有以下代码来计算n!
import numpy as np
print "n! (for n<31)"
print
n = input("Enter n: ")
lst = []
for i in range(1,n+1):
lst.append(i)
print lst #Just to see if the program is working
print "n!: ", np.prod(lst)
但是,对于某些数字,程序返回负值。
EG。 当我为n = 20运行时,以下是来自控制台:
n! (for n<31)
Enter n: 20
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
n!: -2102132736
n = 32也会发生 但是,该程序适用于其他数字,例如。 3!应该返回6。
有人可以解释一下。
答案 0 :(得分:3)
这是numpy的prod功能文档的链接:
如果你转到该页面的底部,你会看到最后一个例子说当x(函数的给定参数)是无符号整数时,返回的结果是默认平台整数。因此,当结果超过可以存储在32位整数中的numpy时,numpy不会将结果转换为long类型,就像python通常那样。所以你得到整数溢出。
如果你声明一个函数:
def fact(n): return 1 if n == 1 else (n * fact(n-1))
并且做:
fact(20)
你得到:
2432902008176640000L
这是20的正确值!
顺便说一下,做:
lst = []
for i in range(1,n+1):
lst.append(i)
不理想。 Python的范围功能可以轻松完成!尝试:
lst = range(1, n + 1)
你已经在你的for循环中做了这个!你可以在解释器中测试它:
>>> range(1, 20 + 1)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
答案 1 :(得分:1)
我强烈怀疑Numpy正在创建一个32位整数数组。
因此,当n时你看到整数溢出!大于32位整数的限制。
尝试:
print "n!: ", np.prod(lst, dtype=np.uint64)
答案 2 :(得分:0)
正如我在评论中所写,这是一个32位的问题。如果你有一个64位系统,你仍然可以计算最多20个!
这是一个没有numpy的解决方案,有python内置类型,可以非常安全地处理这些问题:
def factorial(n):
result = 1
for i in range(1, n+1):
result *= i
return result
n = input("n! (for n<31)\n\nEnter n: ")
print("n!: %d" % factorial(n))
这是一个弯曲你的思想的递归函数; - )
def factorial_r(n):
if n < 2:
return 1
return n * factorial_r(n-1)
n = input("n! (for n<31)\n\nEnter n: ")
print("n!: %d" % factorial_r(n))