C#Int64解析 - 投掷错误?

时间:2017-10-31 08:34:15

标签: c#

我接受了挑战,创建了一个基于控制台的基本计算器。我有一个函数应该返回一个数字的阶乘,虽然我已经使用了Int32.Parse。如果我尝试显示任何大于19的数字的阶乘,它会溢出。我试图切换到Int64.ParseConvert.ToInt64,但这不起作用。后来我注意到long是64位整数类型。我用long替换了整数并尝试了Int64.ParseConvert.ToInt64。这些都不起作用。我甚至对大于19的数字做了一个例外,它说它可能会出错。这是我的基本代码:

string factInput;
int userInput; //Or: long userInput; (Both throw errors)

Console.WriteLine("What number do you want to display the factorial of? Please type in the number when prompted.");
Console.WriteLine("Please type in number:");

factInput = Console.ReadLine();
userInput = Int64.Parse(factInput);

if (userInput >= 20)
{
    Console.WriteLine("Found error - Integer bound to 32-bit integer overflow limit. Continuing operation, expecting errors.");
}

Console.WriteLine("Calculation completed. Result:");
Console.WriteLine(Fact(userInput));
userInput = 0;
factInput = "nul";

1 个答案:

答案 0 :(得分:5)

int / Int32的最大值 2,147,483,647 long / Int64的最大值 9,223,372,036,854,775,807 21 的阶乘例如 51,090,942,171,709,440,000 。这比最大值大!

您应该使用BigInteger课程。该类位于System.Numerics名称空间。

将您对项目的引用添加到System.Numerics程序集,并将以下行添加到代码的using部分:

using System.Numerics;

然后您的Fact方法可能如下所示:

public static BigInteger Fact(long input)
{
    var result = new BigInteger(input);
    while (--input > 0)
    {
        result *= input;
    }
    return result;
}

注意:这绝对不是计算数字阶乘的最佳/最佳方式。您可以在Google上搜索更有效地计算它的方法。

然后使用该方法:

Console.WriteLine(Fact(userInput));