思想:普通的按递归的方法求阶层的话,到70的时候就会溢出了。所以采用数组去保存结果的每一位数字,
static void Main(string[] args)
{
int[] a = CalculateLargeNumber(5);
for (int i = a.Length-1; i >= 0; i--)
Console.Write(a[i]);
Console.Read();
}
public static int[] CalculateLargeNumber(int n)
{
if (n < 0) { throw new ArgumentOutOfRangeException("n必须为非负数。"); }
if (n == 0 || n == 1) { return new int[] { 1 }; }
// 数组的最大长度
const int MaxLength = 100000;
int[] array = new int[MaxLength];
// 1! = 1
array[0] = 1;
int i = 0;
int j = 0;
// valid为当前阶乘值的位数(如5! = 120,此时valid = 3)
int valid = 1;
for (i = 2; i <= n; i++)
{
long carry = 0;
for (j = 0; j < valid; j++)
{
long multipleResult = array[j] * i + carry;
// 计算当前位的数值
array[j] = (int)(multipleResult % 10);
// 计算进到高位的数值
carry = multipleResult / 10;
}
// 为更高位赋值
while (carry != 0)
{
array[valid++] = (int)(carry % 10);
carry /= 10;
}
}
int[] result = new int[valid];
Array.Copy(array, result, valid);
return result;
}
}