我接受了挑战,创建了一个基于控制台的基本计算器。我有一个函数应该返回一个数字的阶乘,虽然我已经使用了Int32.Parse
。如果我尝试显示任何大于19的数字的阶乘,它会溢出。我试图切换到Int64.Parse
,Convert.ToInt64
,但这不起作用。后来我注意到long
是64位整数类型。我用long替换了整数并尝试了Int64.Parse
和Convert.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";
答案 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));