2013-05-16 1 views
-1

Я решаю проблему расчета факториала, и задача заключается в следующем:Ограничение времени программы c при вычислении факториала чисел в c

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<stdio.h> 
#include<stdlib.h> 
#include<math.h> 
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<N;i++) 
     { 
      t=(b[i]*j)+q; 
      q=t/10; 
      b[i]=t%10; 
     } 
    } 
    for(i=d-1;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

+0

Вопрос, вероятно, принадлежит http://codereview.stackexchange.com? –

+0

В вашем вычислении во внутреннем цикле 'for (i = 0; i

+1

Используйте 'memset' или' bzero', не устанавливайте нулевой массив с помощью циклов. – phoeagon

ответ

2

Поскольку 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); 
} 

После этого, глядя вверх значение тривиально.

Примечание:

Это может быть даже более эффективным для сканирования входного вектора для самого высокого числа и только вычислить факториалы до этого числа.

 Смежные вопросы

  • Нет связанных вопросов^_^