我的代码对数字进行阶乘,但出于某种原因,每当我输入数字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();
答案 0 :(得分:3)
整数是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
改为长,至少可以让你去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
资源:
答案 1 :(得分:0)
您正在使用integers
,其最大值为2,147,483,647
(13个数字)
您需要使用更大的数字类型,例如说int64
,long
或其他类型,以便解决您当前的问题。
答案 2 :(得分:0)
您正在获得整数溢出https://en.wikipedia.org/wiki/Integer_overflow 你可以使用
long k = C;
而不是
int k = C;
将溢出限制增加到2 ^ 63 - 1而不是2 ^ 31 - 1