【问题标题】:Factorial function yields incorrect values for the high parameters阶乘函数对高参数产生不正确的值
【发布时间】:2012-07-25 19:49:58
【问题描述】:

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

Factor.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

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

【问题讨论】:

  • 我对 C# 不是很有经验,但我有预感。 ulong 的范围是 0 到 18,446,744,073,709,551,615 而 60! = 8320987112741390144276341183223364380754172606361245952449277696409600000000000000 我想你可能会在这里看到问题。
  • 至少,给出一个错误案例的例子,包括预期值和实际值。
  • @HenkHolterman 他做到了。 (预期在链接中。)

标签: c# console console-application factorial


【解决方案1】:

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

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

【讨论】:

    【解决方案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 的引用

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-22
      • 2016-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多