我试图通过在计算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的正确答案!但不是在那之后!我的解决方案出了什么问题?
答案 0 :(得分:2)
问题可能是因为这个循环:
for(i=1;i<n;i++)//initialize array
在循环中,清除已分配内存的n - 1
条目,但为d
条目分配内存。如果n - 1
大于d
,则在已分配的内存之外写入,这会导致未定义的行为。如果n - 1
小于d
,那么您将保留一些未初始化的内存,当您访问它时,这也是未定义的行为。
答案 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;
}