0

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

阶乘.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;

        }


    }
}

主程序.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

根据互联网上最可靠的来源,可以使用低数字,但否则(例如 60)它会输出不正确的值。你能指出我的错误吗?对我来说,这两种完全不同的方法以完全相同的方式出错,这让我难以置信。

4

2 回答 2

7

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

如果您确实想探索更大的数字,.NET 4 引入了您可能感兴趣的BigInteger 结构。

于 2012-07-25T19:57:43.270 回答
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 的引用

于 2012-07-25T20:05:53.530 回答