输入大于 12 时阶乘计算失败
Factorial Calculation Fails When Input Is Higher Than 12
我的代码对数字进行阶乘,但出于某种原因,每当我输入 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!在大多数系统中,您必须更改为浮点数才能超出浮点数,即使那样,您也会开始看到舍入错误。即使是 unsigned long 也不能让你达到 21!
现在,要超过 20!,您可以使用 BigInteger 结构(那里有很棒的代码项目示例)。它没有定义上限或下限,但如果数字对您的系统来说太大,您可以 运行 进入 memory/system 问题。根据 MSDN:
The BigInteger type is an immutable type that represents an arbitrarily large integer whose value in theory has no upper or lower bounds.
int factorial = 25;
BigInteger bigInt = 1;
while (factorial > 1)
bigInt = BigInteger.Multiply(factorial--, bigInt);
var output = bigInt.ToString(); // Would give you the 26 digits
资源:
- 大整数: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(乌龙):https://msdn.microsoft.com/en-us/library/system.uint64.maxvalue(v=vs.110).aspx
- Int64.MaxValue(长):https://msdn.microsoft.com/en-us/library/system.int64.maxvalue(v=vs.110).aspx
- Int32.MaxValue(整数):https://msdn.microsoft.com/en-us/library/system.int32.maxvalue(v=vs.110).aspx
您正在使用 integers
,其最大值为 2,147,483,647
(13 个数字)
您需要使用更大的数字类型,例如 int64
、long
或其他,以解决您眼前的问题。
您遇到整数溢出 https://en.wikipedia.org/wiki/Integer_overflow
您可以使用
long k = C;
而不是
int k = C;
将溢出限制增加到 2^63 - 1 而不是 2^31 - 1
我的代码对数字进行阶乘,但出于某种原因,每当我输入 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!在大多数系统中,您必须更改为浮点数才能超出浮点数,即使那样,您也会开始看到舍入错误。即使是 unsigned long 也不能让你达到 21!
现在,要超过 20!,您可以使用 BigInteger 结构(那里有很棒的代码项目示例)。它没有定义上限或下限,但如果数字对您的系统来说太大,您可以 运行 进入 memory/system 问题。根据 MSDN:
The BigInteger type is an immutable type that represents an arbitrarily large integer whose value in theory has no upper or lower bounds.
int factorial = 25;
BigInteger bigInt = 1;
while (factorial > 1)
bigInt = BigInteger.Multiply(factorial--, bigInt);
var output = bigInt.ToString(); // Would give you the 26 digits
资源:
- 大整数: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(乌龙):https://msdn.microsoft.com/en-us/library/system.uint64.maxvalue(v=vs.110).aspx
- Int64.MaxValue(长):https://msdn.microsoft.com/en-us/library/system.int64.maxvalue(v=vs.110).aspx
- Int32.MaxValue(整数):https://msdn.microsoft.com/en-us/library/system.int32.maxvalue(v=vs.110).aspx
您正在使用 integers
,其最大值为 2,147,483,647
(13 个数字)
您需要使用更大的数字类型,例如 int64
、long
或其他,以解决您眼前的问题。
您遇到整数溢出 https://en.wikipedia.org/wiki/Integer_overflow 您可以使用
long k = C;
而不是
int k = C;
将溢出限制增加到 2^63 - 1 而不是 2^31 - 1