【问题标题】:Calculation of factorial of large numbers in c using arrays使用数组计算c中大数的阶乘
【发布时间】:2013-05-16 13:42:12
【问题描述】:

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

【问题讨论】:

  • @PaulR 我问了你所指的问题,我对它的执行有疑问,因为我测试了多个案例。
  • 您可以使用calloc 函数一步完成,而不是分配和清除(以尽可能慢的方式)分配的内存。
  • @Joachim Pileborg:你是对的,但我怀疑算法在 40 以上时无法正常工作!为什么会有问题?
  • 您应该真正编辑您的代码以使其更具可读性。那个 for 循环看起来很奇怪。

标签: c arrays algorithm factorial


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    如果你对 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));
    

    【讨论】:

      【解决方案3】:
      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;
      }
      

      【讨论】:

        猜你喜欢
        • 2010-11-25
        • 1970-01-01
        • 2023-03-22
        • 1970-01-01
        • 1970-01-01
        • 2015-01-08
        • 1970-01-01
        • 2021-05-29
        相关资源
        最近更新 更多