我的代码中的错误在哪里计算高达99的数字因子?

时间:2016-08-30 09:59:23

标签: c factorial

我正在使用旧学校乘法计算阶乘,但我仍然得到大于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");
}

1 个答案:

答案 0 :(得分:1)

你忘了在乘以数字的十分之前将进位重置为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;