4

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

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

8 回答 8

6

当然——阶乘变得非常大,非常快。你很快就溢出了 int 的范围......并且在某些时候,你将乘以足够的因子以使溢出为 0,然后将值永远保持为 0。

根据 Google 的快速搜索,66 阶乘是 5.44344939 × 10 92 - 这远远超过了int处理能力,甚至longdecimal. 你可以double处理它 - 你会失去大量的精度,而且会很快积累,但至少它不会溢出......

于 2010-11-17T08:29:06.820 回答
4

66!不适合int. 使用BigInteger.

于 2010-11-17T08:30:17.320 回答
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. 这将给出正确的结果。在 C# 中计算阶乘包含有关此的更多信息。

于 2010-11-17T08:32:22.643 回答
2

问题是 66 的阶乘对于int. 我认为它也会让我们大到适应一个long.

例如,factorial(20)将返回2432902008176640000

于 2010-11-17T08:29:52.583 回答
2

50 的阶乘是 3.0414093202×1064,它已经超过了 int 可以包含的值。

为此使用long或。BigInteger

于 2010-11-17T08:31:48.380 回答
1

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

于 2010-11-17T08:29:19.893 回答
1

大约 13 或 14 是最大的数,其阶乘适合 int ......如果你切换到 long,如果我没记错的话,它会在 18 或 19 左右。如果您希望任意大数字,则必须编写自己的大型算术库或使用现有的 :)

于 2010-11-17T08:31:08.457 回答
0

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

在这种情况下,Big Integer 数据类型可能最能体现数字变大的速度。

这是您使用此数据类型的方式。

图1

右键单击您的项目,选择添加引用菜单。

图2

查找 system.numerics 库并添加它。

图3

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

图4

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

于 2017-11-21T10:53:35.453 回答