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