-4

我正在尝试计算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 个!但不是在那之后!我的解决方案有什么问题?

4

3 回答 3

2

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

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

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

您应该通过使用循环、使用memsetcalloc在分配时使用来清除所有内存。

于 2013-05-16T13:56:04.617 回答
1

如果你对 calloc 不太感兴趣,可能你可以使用 memset,我猜 null 检查是强制性的

所以不是这个循环

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));
于 2013-05-16T14:27:42.637 回答
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;
}
于 2015-10-26T10:25:56.117 回答