因子方法导致错误

我试图得到数字66的阶乘值,但我的方法导致输出0 。 但每当我试图得到5的阶乘时,它就会产生120输出。 谁能告诉我为什么?

public static int factorial(int n) { if (n == 1) return n; return n * factorial(n - 1); } 

当然 – 阶乘非常快,非常快。 你很快就会溢出int的界限……并且在某些时候你会乘以足够的因子来使溢出变为0,然后将值永远保持为0。

根据谷歌的快速搜索,66 factorial是5.44344939×10 92 – 这远远超过int可以处理的,甚至是longdecimal 。 你可以double处理它 – 你会失去很大的精度,这也会很快积累,但至少它不会溢出……

你的方法溢出了。 请参阅以下示例:

 static void Main(string[] args) { Console.WriteLine(factorial(66)); } public static int factorial(int n) { if (n == 1) return n; var result = n * factorial(n - 1); Console.WriteLine("{0} : {1}", n, result); return result; } 

在此示例中,将打印每次迭代的结果。

您可以看到,在某一点上,结果变为0 ,这意味着从该点开始的每次迭代都变为n * 0

您可以尝试使用BigInteger 。 这将给出正确的结果。 计算C#中的阶乘包含有关此内容的更多信息。

66! 不适合int 。 使用BigInteger

问题是66的阶乘是大到适合int 。 我认为我们也将采用大型方式来适应long

例如, factorial(20)将返回2432902008176640000

50的阶乘是3.0414093202×1064,它已经执行了int可以包含的内容。

使用longBigInteger

你得到数字溢出,66! 〜= 5e92这比int可以处理的大。 此外,使用for循环可以更好地计算阶乘。

大约13或14是最大的数字,其阶乘拟合在一个整数…如果你切换到长,如果我没记错的话它将是18或19。 如果您希望任意大数字,您必须编写自己的大算术库或使用现有的算术库:)

您需要使用适当的数据类型。

在这种情况下,Big Integer数据类型可能最好看到数字变得多大的速度。

以下是使用此数据类型的方式。

PIC1

右键单击您的项目,选择添加参考菜单。

PIC2

查找system.numerics库并添加它。

PIC3

然后在代码中添加using子句。

PIC4

然后您可以像往常一样使用关键字初始化变量。