因子方法导致错误

时间:2010-11-17 08:25:44

标签: c# factorial

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

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

8 个答案:

答案 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可以包含的内容。

使用longBigInteger进行此操作。

答案 5 :(得分:1)

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

答案 6 :(得分:1)

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

答案 7 :(得分:0)

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

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

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

pic1

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

pic2

查找system.numerics库并添加它。

pic3

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

pic4

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