My code does factorials for numbers, but for some reason whenever i input a number 13 or higher, it either give a wrong number or somehow gets a negative number. Any suggestions?
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();
An integer is 32-bit, so max value is 2,147,483,647. 13! equates to a larger value: 6,227,020,800. You'll have to change to long
to go any higher than 12!, which as a 64-bit number, would give you up to 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
Changing to long at least lets you go to 20! You'd have to change to a floating point to go beyond that in most systems, and even then, you'll start seeing rounding errors. Not even an unsigned long lets you get to 21!
Now, to get beyond 20!, you can use the BigInteger structure (great code project examples are out there). It has no defined upper or lower bounds, but you can run into memory/system issues if the numbers are too large for your system. According to 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
Resources: