我的代码中计算 99 以下数字的阶乘的错误在哪里?

Where is the mistake in my code to calculate factorials of numbers up to 99?

我正在使用老派的乘法方法来计算阶乘,但对于大于 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;