计算c中的数字因子时ac程序的时间限制

我正在解决关于阶乘计算的问题,挑战如下!

You are asked to calculate factorials of some small positive integers. Input An integer t, 1<=t<=100, denoting the number of testcases, followed by t lines, each containing a single integer n, 1<=n<=100. Output For each integer n given at input, display a line with the value of n! 

我的代码给了我正确的解决方案,但超过了时间限制,即2秒:

代码如下:

 #include #include #include void factorial(int N) { printf("\n\n"); int q,i,j,t,d,z; float p=0.0; for(i=2;i<=N;i++) p=p+log10(i); d=(int)p+1;//No of terms in the factorial int *b; //initialization of an array b=(int *)malloc(d*sizeof(int)); b[0]=1; for(i=1;i<N;i++) b[i]=0; //calculation of factorial p=0.0; for(j=2;j<=N;j++) { q=0; p=p+log10(j); z=(int)p+1; for(i=0;i=0;i--) printf("%d",b[i]); } int main() { int n,i,j; scanf("%d",&n); int *b; b=(int *)malloc(n*sizeof(int)); for(i=0;i<n;i++) { scanf("%d",&b[i]); } for(i=0;i<n;i++) factorial(b[i]); return 0; } 

如何使我的程序更有效率并在给定的时间内产生输出? 这个挑战来自HackerEarth

由于N很小,一个有效的算法是预先计算所有因子:

 BigNumberType fact[101]; // The numbers will become big, so you need (to create) a type to store it fact[0] = 1.0; for (i=0; i < 100; i++) { fact[i+1] = multiply(fact[i], i); } 

在那之后,查找价值是微不足道的。

注意:

扫描输入向量以获得最高数量并且仅计算高达该数量的因子可能更有效。