小C求改解决方法

小C求改
題目:
这个题目中,会给你一个数字,要求算出这个数字的阶乘。阶乘的定义,比如说下面例子里出现的10. 把1 2 3 4 5 6 7 8 9 10 这10个数字相乘,得出3628800。3628800是个7位数。
输入的东西是由很多行整数组成的。第一行包含一个整数n,n就代表我们需要完成的测试的数量,第一行下面将跟着n行,一行一个整数,这个整数要大于小于1,小于等于10的七次方
输出的东西就是 所输入数字的阶乘的结果的位数。
示例輸入
2
10
20
示例輸出
7
19

我的程序段:
C/C++ code

#include"stdio.h"
#include"math.h"
int factorial(int n)
{
long a[10000];
char b[n];
int i,j,l,c,m=0,w; 
a[0]=1; 
for(i=1;i<=n;i++)
    { 
    c=0; 
    for(j=0;j<=m;j++)
        { 
        a[j]=a[j]*i+c; 
        c=a[j]/10000; 
        a[j]=a[j]%10000; 
    } 
    if(c>0) 
{
m++;
a[m]=c;
} 
} 

w=m*4+log10(a[m])+1;
printf("%d\n",w);
return w;
}
main()
{
long z[1024],o,x;
scanf("%d",&x);
while(x>0&&x<=10000000)
{for(o=0;o<x;o++)
scanf("%d",&z[o]);
for(o=0;o<x;o++)
 {
 if(x<=10000000&&x>=1) 
 factorial(z[o]);
 else printf("error!\n");
 }
scanf("%d",&x);
}

}




Judge Status"Time Limit Exceeded "
爲什麽呢....... 要AC的話該怎麽改

------解决方案--------------------
参见斯特灵公式