求N的阶乘,超大数怎么做

Problem Description
Given an integer N(0 ≤ N ≤ 10000), your task is to calculate N!

如n=10000,求N!

采用万进制,逢万进一,结果存于a数组,结果倒序输出,每个a[i]不足四位前面补0

#include <bits/stdc++.h>
using namespace std;
void f(int n){
    int a[10000+1]={1},carry,digits=1;
    for(int i=2;i<=n;i++){
        carry=0;
        for(int j=0;j<digits;j++){
            a[j]=a[j]*i+carry;
            carry=a[j]/10000;   //进位
            a[j]=a[j]%10000;  //余数
        }
        if(carry>0)
            a[digits++]=carry;
    }
    printf("%d",a[digits-1]);
    for(int j=digits-2;j>=0;j--)
        printf("%04d",a[j]);
    printf("\n");
}

int main(){
    int n;
    while(scanf("%d",&n)!=EOF){
        f(n);
    }
    return 0;
} 

#include <stdio.h>
int main()
{
int a[20001];//储存每一位所得到的数
int temp,digit,n,i,j=0;//temp每次的得数 digit每次得数的位数
scanf("%d",&n);
a[0]=1;//从1开始乘
digit=1;//位数从第一位开始
for(i=2;i<=n;i++)
{
int num=0;
for(j=0;j<digit;j++)
{
temp=a[j]*i+num;//将一个数的每一位数都分别乘以i,
a[j]=temp%10;//将一个数的每一位数利用数组进行储存
num=temp/10;
}
while(num)//判断退出循环后,num的值是否为0
{
a[digit]=num%10;//继续储存
num=num/10;
digit++;
}
}
for(i=digit-1;i>=0;i--)//倒序输出每一位
printf("%d",a[i]);
printf("\n");
return 0;
}