用数组计算c中大数的阶乘

时间:2013-05-16 13:42:12

标签: c arrays algorithm factorial

我试图通过在计算factorial中的位数后动态分配内存来计算c中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的正确答案!但不是在那之后!我的解决方案出了什么问题?

3 个答案:

答案 0 :(得分:2)

问题可能是因为这个循环:

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

在循环中,清除已分配内存的n - 1条目,但为d条目分配内存。如果n - 1大于d,则在已分配的内存之外写入,这会导致未定义的行为。如果n - 1小于d,那么您将保留一些未初始化的内存,当您访问它时,这也是未定义的行为。

您应该清除所有内存,方法是使用循环,使用memset或在分配时使用calloc

答案 1 :(得分: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));

答案 2 :(得分: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;
}