public class Factorial
{
private int baseNumber = 100000;
public int BaseNumber
{
get
{
return baseNumber;
}
}
private int number;
private List<int> result = new List<int>();
public Factorial(int n)
{
number = n;
result = new List<int>();
}
public List<int> Calculate()
{
int digit = (int)System.Math.Log10(baseNumber);
int len = (int)(number * System.Math.Log10((number + 1) / 2) / digit);
len += 2;
int[] a = new int[len];
int i, j;
long c;
int m = 0;
a[0] = 1;
for (i = 2; i <= number; i++)
{
c = 0;
for (j = 0; j <= m; j++)
{
long t = a[j] * i + c;
c = t / baseNumber;
a[j] = (int)(t % baseNumber);
}
while (c > 0)
{
m++;
a[m] = (int)(c % baseNumber);
c = c / baseNumber;
}
}
for (i = 0; i <= m; i++)
{
result.Add(a[i]);
}
return result;
}
public override string ToString()
{
if (result.Count == 0)
{
Calculate();
}
StringBuilder sb = new StringBuilder();
int digit = (int)System.Math.Log10(baseNumber);
sb.Append(result[result.Count - 1]);
for (int i = 0; i < result.Count; i++)
{
sb.Append(result[i].ToString().PadLeft(digit, '0'));
}
return sb.ToString();
}
}
.Net 大数阶乘
最新推荐文章于 2021-09-23 20:55:44 发布