之前我问过这个问题,但那些不理解这个问题的人却关闭了。我不是在寻找一个循环,我正在寻找你如何为生产代码做这些事情,比如参数和溢出的错误处理。
请不要只说“使用库X”,除非您可以链接到所述库的代码,它实际上解决了这些问题。
答案 0 :(得分:9)
使用表格查找。你不需要大表,因为factorial会很快溢出64位双精度变量范围。您只需要存储从0到170的参数值的函数值。超出该范围的任何内容都应该生成错误。
答案 1 :(得分:6)
这取决于输入的域名。
如果您使用的是32位或64位整数,则根本不应使用循环:只需使用查找表。没有很多n
n!
可由64位整数表示。使用查找表,检查溢出很容易:如果查找表中没有n
条目,则显然超出范围。
如果输入大于那个,那么可能你会使用某种“大整数”类,溢出不太可能成为问题。
答案 2 :(得分:3)
可能是一件简单的事情:
unsigned factorial(unsigned n)
{
if (n > theUpperThreshold)
throw ExceptionFormYourMathLibrary("Explain that n! can't be represented by unsigned");
return lookupTable[n];
}
除非您的数学库也提供了一些大整数类。