我使用的是旧式乘法方法来计算阶乘,但是对于大于13的数字,我仍然得到错误的答案。我知道没有数据类型可以准确地容纳这么大的值,因此我使用数组将数字存储在分别编号。

代码中的“ cas”表示要计算阶乘的数量。

这是代码-

void factorial (int cas)
{
  int num[158];
  num[0] = 1;

  for (int i=1; i<158; i++)
  {
    num[i] = 0;
  }

  int row1[158];
  int row2[158];
  int length = 0;
  int max = 0;
  int carry = 0;

  for (int j=1; j<=cas; j++)
  {
    for (int i=0; i<158; i++)
    {
      row1[i] = 0;
      row2[i] = 0;
    }

    for (length=157; length>=0; length--)
    {
      if (num[length] != 0)
      break;
    }

    if (j/10 < 1)
    {
      int* ptr = num;
      carry = 0;

      for (int i=0; i<=length; i++)
      {
        int mult = (j * num[i]) + carry;
        int units = mult % 10;
        carry = mult / 10;
        *ptr = units;
        ptr++;
      }
      *ptr = carry;
    }
    else
    {
      int* ptr = num;
      int* ptr1 = row1;
      row2[0] = 0;
      int* ptr2 = row2 + 1;
      carry = 0;

      for (int i=0; i<=length; i++)
      {
        int mult = ((j%10) * num[i]) + carry;
        int units = mult % 10;
        carry = mult / 10;
        *ptr1 = units;
        ptr1++;
      }
      *ptr1 = carry;

      for (int i=0; i<=length; i++)
      {
        int mult = ((j/10) * num[i]) + carry;
        int units = mult % 10;
        carry = mult / 10;
        *ptr2 = units;
        ptr2++;
      }
      *ptr2 = carry;

      for (max=157; max>=0; max--)
      {
        if (row1[max] != 0 || row2[max] != 0)
        break;
      }

      carry = 0;

      for (int i=0; i<=max; i++)
      {
        int add = row1[i] + row2[i] + carry;
        int units = add % 10;
        carry = add / 10;
        *ptr = units;
        ptr++;
      }
      *ptr = carry;
    }

  }
  for (length=157; length>=0; length--)
    {
      if (num[length] != 0)
      break;
    }

  for (;length>=0;length--)
  {
    printf("%i",num[length]);
  }

  printf("\n");
}

最佳答案

您忘了将进位乘以数字的十分之一,然后将进位重置为0。

  }
  *ptr1 = carry;

  carry = 0;  // ADDED LINE: Reset carry before multiplying with the tens part

  for (int i=0; i<=length; i++)
  {
    int mult = ((j/10) * num[i]) + carry;

关于c - 我的代码中计算不超过99的阶乘的错误在哪里?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39224407/

10-13 07:10