调用方法看主函数
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define PI 3.141592654
#define E 2.71828182846
int *fun(int n, int *count)
{
if (n < 0)
return NULL;
int bits = log10(2 * PI * n) / 2 + n * log10(n / E) + 1 + 1;
;
int indexlow = bits - 1;
int total;
int maxi_lowIndex = 0;
static int arr[] = {1, 1, 2, 6, 24, 120, 720, 5040};
//0/1/2/3/4/5/6/7的阶乘直接返回结果
if (n < 8)
{
*count = 1;
return &arr[n];
}
//8以上(含8)的阶乘用数组存放结果
int *p = (int *)calloc(bits, sizeof(int));
if (!p)
return NULL;
p[bits - 4] = 5;
p[bits - 3] = 0;
p[bits - 2] = 4;
p[bits - 1] = 0;
for (int i = 8; i <= n; i++)
{
for (int j = indexlow; j >= 0; j--)
{
p[j] *= i;
}
for (int k = indexlow; k > 0; k--)
{
total = p[k];
if (total > 9)
{
p[k] = total % 10;
p[k - 1] += total / 10;
maxi_lowIndex = k - 1;
}
}
}
*count = bits - maxi_lowIndex;
return (p + maxi_lowIndex);
}
int main(int argc, char *argv[])
{
int n, count = 0;
scanf("%d", &n);
int *p = fun(n, &count);
puts("");
for (int i = 0; i < count; i++)
printf("%d", *(p + i));
puts("");
if (p && count > 7)
free(p);
return 0;
}