我正在尝试获得数字 66 的阶乘值,但我的方法导致输出 0 。但每当我尝试得到 5 的阶乘时,就会产生 120 的输出。谁能告诉我为什么?
public static int factorial(int n)
{
if (n == 1)
return n;
return n * factorial(n - 1);
}
答案 0 :(得分:6)
当然 - 阶乘非常快,非常快。你快速溢出了int very 的界限......在某些时候你会乘以足够的因子来使溢出变为0,然后将值永远保持为0。 / p>
根据谷歌的快速搜索,66阶乘是5.44344939×10 92 - 远远超过int
可以处理,甚至long
或{{1} }。你可以让decimal
来处理它 - 你会失去很大的精确度,这也会很快积累,但至少它不会溢出......
答案 1 :(得分:4)
66!不适合int
。使用BigInteger
。
答案 2 :(得分:4)
你的方法溢出了。请参阅以下示例:
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
。这将给出正确的结果。 Calculate factorials in C#包含有关此内容的更多信息。
答案 3 :(得分:2)
问题在于66的阶乘是大到适合int
的方式。我认为我们也可以通过扩展来适应long
。
例如,factorial(20)
将返回2432902008176640000
答案 4 :(得分:2)
50的阶乘是3.0414093202×1064,它已经执行了int可以包含的内容。
使用long
或BigInteger
进行此操作。
答案 5 :(得分:1)
你得到数字溢出,66! 〜= 5e92,这比int
可以处理的大。此外,使用for循环可以更好地计算阶乘。
答案 6 :(得分:1)
大约13或14是最大的数字,其阶乘拟合在一个int ...如果你切换到long,如果我没记错的话它将会是18或19。如果您希望任意大数字,您必须编写自己的大型算术库或使用现有的算术库:)
答案 7 :(得分:0)