我试图获得数字66的阶乘值,但我的方法导致输出0。但是,每当我尝试获得5的阶乘时,都会得到输出120。谁能告诉我为什么?
public static int factorial(int n)
{
if (n == 1)
return n;
return n * factorial(n - 1);
}
当然——阶乘变得非常大,非常快。你很快就溢出了 int 的范围......并且在某些时候,你将乘以足够的因子以使溢出为 0,然后将值永远保持为 0。
根据 Google 的快速搜索,66 阶乘是 5.44344939 × 10 92 - 这远远超过了int
处理能力,甚至long
或decimal
. 你可以double
处理它 - 你会失去大量的精度,而且会很快积累,但至少它不会溢出......
66!不适合int
. 使用BigInteger
.
你的方法溢出了。请参见以下示例:
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
. 我认为它也会让我们大到适应一个long
.
例如,factorial(20)
将返回2432902008176640000
50 的阶乘是 3.0414093202×1064,它已经超过了 int 可以包含的值。
为此使用long
或。BigInteger
你得到数字溢出,66!~= 5e92 这比int
can 处理的要大得多。此外,使用 for 循环可以更好地计算阶乘。
大约 13 或 14 是最大的数,其阶乘适合 int ......如果你切换到 long,如果我没记错的话,它会在 18 或 19 左右。如果您希望任意大数字,则必须编写自己的大型算术库或使用现有的 :)