2013-05-16 2 views
-4

Я пытаюсь вычислить факториал очень больших чисел с, как 100 .. путем динамического выделения памяти после вычисления количества цифр в факториале: Мой код:Расчета факториала больших чисел в с использованием массивов

int main() 
{ 
    int n,q,i,j,z,t,d; 
    float p=0.0; 
    printf("Enter the number whose factorial is to be calculated:\n"); 
    scanf("%d",&n); 
    //calculating number of digits 
    for(j=2;j<=n;j++) 
    p=p+log10(j); 
    d=(int)p+1; 
    printf("No of digits in the factorial are:%d\n",d); 
    int *a; 
    a=(int *)malloc(d*sizeof(int));//allocation of memory 
    a[0]=1; 
    for(i=1;i<n;i++)//initialize array 
    a[i]=0; 
    p=0.0; 
    for(j=2;j<=n;j++) 
    { 
     q=0; 
     p=p+log10(j); 
     z=(int)p+1; 
     for(i=0;i<z;i++) 
     { 
      t=(a[i]*j)+q; 
      q=t/10; 
      a[i]=t%10; 
     } 
    } 
    printf("\n"); 
    for(i=d-1;i>=0;i--) 
    { 
     printf("%d",a[i]); 
    } 

    return 0; 
} 

Его предоставление правильных ответов до 40! но не после этого! Что не так с моим решением?

+0

Возможный дубликат [Ограничение времени программы ac при вычислении факториала чисел в c] (http://stackoverflow.com/questi ons/16586842/time-limit-of-ac-program-while-calculate-factorial-of-numbers-in-c) –

+0

@PaulR Я задал вопрос u, имея в виду, и im сомневается в его выполнении, как я тестировал с несколько случаев. – poorvankBhatia

+0

Вместо выделения и очистки (что вы делаете самым медленным способом) выделенной памяти, вы можете сделать это за один шаг с помощью ['calloc'] (http://en.cppreference.com/w/c/ память/calloc). –

ответ

2

Проблема, вероятно, из-за этого цикла:

for(i=1;i<n;i++)//initialize array 

В цикле вы снимите n - 1 записи из выделенной памяти, но выделить память для d записей. Если n - 1 больше d, тогда вы пишете вне выделенной памяти, что вызывает неопределенное поведение. Если n - 1 меньше, чем d, тогда вы оставляете неинициализированную память, которая также является неопределенным поведением при ее доступе.

Вы должны очистить всю память, используя ваш цикл, используя memset или используя calloc при распределении.

+0

Спасибо, что это сработало! – poorvankBhatia

1

может быть, вы можете использовать MemSet в случае не совсем заинтересован в calloc, и я предполагаю, что нулевая проверка является обязательной

так вместо этого цикла

a=(int *)malloc(d*sizeof(int));//allocation of memory 
    a[0]=1; 
for(i=1;i<n;i++)//initialize array 
    a[i]=0; 

простой вызов

a=(int *)malloc(d*sizeof(int));//allocation of memory 
if(a == NULL) 
{ 
    printf("OOM Error"); 
    exit(1); 
} 
memset(a, 0 , d*sizeof(int)); 
0
int main() 
{ 
int i,j,n,m=0; 

scanf("%d",&n); 

int arr[2000]; 
int temp=0; 
int inter=1; 
arr[0]=1; 

for(i=1;i<n;i++) 
{ 
    for(j=0;j<=m;j++) 
    { 
    inter=arr[j]*i+temp; 
    arr[j]=inter%10; 
    temp=inter/10; 
     if(temp>0 && j==m) 
     m++; 
    } 
} 
for(i=m;i>=0;i++) 
{ 
printf("%d",arr[i]); 
} 
return 0; 
}