2011-04-21 47 views
1

我之前问过这个问题,但是没有理解这个问题的人关闭了它。我不是在寻找一个循环,我正在寻找如何为生产代码做这样的事情,比如处理参数和溢出的错误。如何通过适当的错误处理在C++中实现阶乘函数?

请不要只说“使用库X”,除非您可以链接到上述库的代码,它实际上解决了这些问题。

+2

所以你的问题与阶乘无关,而是关于“正确编程”? – 2011-04-22 00:01:01

+0

非常好。我不会说它不完全与阶乘没有任何关系,因为我认为你不会想要重量级的错误处理,比如简单的问题。 – 2011-04-22 16:20:46

回答

3

可能是简单的东西如:

unsigned factorial(unsigned n) 
{ 
    if (n > theUpperThreshold) 
     throw ExceptionFormYourMathLibrary("Explain that n! can't be represented by unsigned"); 

    return lookupTable[n];  
} 

除非你的数学库提供了一些大的整数类为好。

6

它取决于输入的域。

如果您使用的是32位或64位整数,则根本不应该使用循环:只需使用查找表即可。没有很多n,其中n!可以用64位整数表示。使用查找表,检查溢出很容易:如果在查找表中没有n的条目,则显然超出范围。

如果输入大于那个值,那么大概你会使用某种“大整数”类,溢出不太可能成为问题。

+0

你是不是故意说“如果你的**输出**是一个32位或64位整数?” – 2011-04-21 23:57:15

+0

@Ken:是的,其实这就是我的意思。谢谢。 – 2011-04-21 23:58:11

+1

@霍华德:我知道这很小, 6点以后!我的大脑抛出一个溢出异常,所以我停在那里。 – 2011-04-22 00:03:10

9

使用表格查找。你不需要大表,因为阶乘会很快溢出64位双精度变量范围。您只需要存储参数值从0到170的函数值。超出该范围的任何值都会产生错误。

+0

要添加到此,您还可以使用模板来生成列表。 – alternative 2011-04-22 00:04:43

+0

你怎么产生这个错误?例外?返回-1?一个断言?我是否应该使用out参数并返回0来获得成功?这里有很多选择。 – 2011-04-22 16:19:51

+0

不要使用out参数来实现这样一个简单的功能。返回-1或抛出异常。 – pic11 2011-04-22 21:40:37