因子函数为高参数产生不正确的值

时间:2012-07-25 19:49:59

标签: c# console console-application factorial

这个小程序测试了两种计算阶乘的方法 - 迭代和递归。

Factorial.cs:

using System;

namespace Functions
{
    public class Factorial
    {
        public static ulong CalcRecursively(int number)
        {
            if (number > 1)
                return (ulong)number * CalcRecursively(number - 1);
            if (number <= 1)
                return 1;

            return 0;
        }

        public static ulong Calc(int number)
        {
            ulong rValue=1;

            for (int i = 0; i < number; i++)
            {
                rValue = rValue * (ulong)(number - i);                
            }

            return rValue;

        }


    }
}

MainProgram.cs:

using System;

using Functions;
class FunctionClient
{


    public static void Main()
    {

        Console.WriteLine("{0}\n", Functions.Factorial.CalcRecursively(TESTED_VALUE));
        Console.WriteLine("{0}\n", Functions.Factorial.Calc(TESTED_VALUE));

        Console.ReadKey();

    }

    const int TESTED_VALUE = 60;

}

控制台:

  

9727775195120271360
  9727775195120271360

低数字可以正常,但除此之外(f.ex.with 60)根据the most reliable source on the internet输出不正确的值。你能指出我的错误吗?对我来说,两种完全不同的方法以完全相同的方式工作是不可能的。

2 个答案:

答案 0 :(得分:7)

您正在遇到C#的ulong数据类型的限制。它是一个64位数据结构,根据MSDN将其限制为最大值18,446,744,073,709,551,615。

如果你想探索更大的数字,.NET 4引入了你可能感兴趣的BigInteger structure

答案 1 :(得分:2)

using System.Numerics;

public static BigInteger Calc(int number)
{
    BigInteger rValue = 1;
    for (int i = 0; i < number; i++)
    {
        rValue = rValue * (ulong)(number - i);
    }
    return rValue;
}

添加对System.Numerics的引用