当输入大于12时,阶乘计算失败
本文关键字:阶乘 计算 失败 12时 输入 大于 | 更新日期: 2023-09-27 18:02:19
我的代码对数字进行阶乘,但由于某种原因,每当我输入13或更高的数字时,它要么给出错误的数字,要么以某种方式得到一个负数。有什么建议吗?
List<int> myList = new List<int>();
Console.WriteLine("My Job is to take the factorial of the number you give");
Console.WriteLine("What is the number?");
string A = Console.ReadLine();
int C = Convert.ToInt32(A);
int k = C;
int B = C;
int U = C - 1;
Console.Write("{0} ", B);
while (U != 0)
{
k *= U;
Console.Write("* {0} ", U);
U--;
}
Console.WriteLine(" = {0}", k);
Console.ReadLine();
整数为32位,因此最大值为2,147,483,647。13 !等于一个更大的值:6,227,020,800。你必须换到long
才能高于12!,作为64位数字,您将得到9,223,372,036,854,775,807。
Type Max Fact Max Value
int 12! 6,227,020,800
long 20! 9,223,372,036,854,775,807
ulong 20! 18,446,744,073,709,551,615
改为long至少可以让你达到20!在大多数系统中,您必须将其更改为浮点数才能超过此值,即使这样,您也会开始看到舍入错误。即使是无号长也不能让你达到21分!
现在,要超过20!,您可以使用BigInteger结构(有很好的代码项目示例)。它没有定义的上限或下限,但是如果数字对于您的系统来说太大,您可能会遇到内存/系统问题。根据MSDN:
BigInteger类型是一种不可变类型,它表示一个任意大的整数,其值在理论上没有上限或下限。
int factorial = 25;
BigInteger bigInt = 1;
while (factorial > 1)
bigInt = BigInteger.Multiply(factorial--, bigInt);
var output = bigInt.ToString(); // Would give you the 26 digits
资源:
- 先导入BigInteger:
- https://msdn.microsoft.com/en-us/library/system.numerics.biginteger (v = vs.110) . aspx
- BigInteger代码项目:http://www.codeproject.com/Tips/270413/Calculate-the-Factorial-of-an-Integer-in-Csharp
- UInt64。MaxValue (ulong): https://msdn.microsoft.com/en-us/library/system.uint64.maxvalue(v=vs.110).aspx
- Int64。MaxValue (long): https://msdn.microsoft.com/en-us/library/system.int64.maxvalue(v=vs.110).aspx
- Int32。MaxValue (int): https://msdn.microsoft.com/en-us/library/system.int32.maxvalue(v=vs.110).aspx
您正在使用integers
,其最大值为2,147,483,647
(13个数字)
https://msdn.microsoft.com/en-us/library/system.int32.maxvalue%28v=vs.110%29.aspx?f=255& MSPPError = -2147217396
您需要使用更大的数字类型,如int64
, long
,或其他为了解决您的直接问题。
您正在获得整数溢出https://en.wikipedia.org/wiki/Integer_overflow你可以使用
long k = C;
不是int k = C;
将溢出限制从2^31 - 1改为2^63 - 1