Как исправить вывод следующей программы на C? - PullRequest
0 голосов
/ 07 января 2019

У меня проблема с выводом следующей программы на Си. Это не дает мне правильный вывод. Я преобразовываю эту программу из суммы двух больших чисел. Таким образом, я получаю вывод с некоторыми «ошибками», такими как «232423-3-4-34--3424» вместо «23242334343424». Как мне это исправить?

 #include<stdio.h>
int main() {
  int num1[255], num2[255], dif[255];
  char s1[255], s2[255];
  int l1, l2;

  printf("Enter Number1:\n");
  scanf("%s", &s1);
  printf("Enter Number2:\n");
  scanf("%s", &s2);

  for (l1 = 0; s1[l1] != '\0'; l1++)
    num1[l1] = s1[l1] - '0';

  for (l2 = 0; s2[l2] != '\0'; l2++)
    num2[l2] = s2[l2] - '0';

  int carry = 0;
  int k = 0;
  int i = l1 - 1;
  int j = l2 - 1;
  for (; i >= 0 && j >= 0; i--, j--, k++) {
    dif[k] = (num1[i] - num2[j] - carry) % 10;
    carry = (num1[i] - num2[j] - carry) / 10;
  }
  if (l1 > l2) {

    while (i >= 0) {
      dif[k++] = (num1[i] - carry) % 10;
      carry = (num1[i--] - carry) / 10;
    }

  } else if (l1 < l2) {
    while (j >= 0) {
      dif[k++] = (num2[j] - carry) % 10;
      carry = (num2[j--] - carry) / 10;
   }
  } else {
    if (carry > 0)
      dif[k++] = carry;
  }


  printf("Result:");
  for (k--; k >= 0; k--)
    printf("%d", dif[k]);

  return 0;
}

1 Ответ

0 голосов
/ 07 января 2019

Ваш результат содержит отрицательные числа, потому что код неправильно реализует арифметику по модулю 10. В таких строках:

dif[k] = (num1[i] - num2[j] - carry) % 10;

Если вычитание num1[i] - num2[j] - carry меньше 0, вы хотите сохранить результат 10-вычитания. Есть языки, в которых оператор % работает так же, как в, но в C он возвращает отрицательное число, поэтому -1 % 10 дает -1, а не 9.

Чтобы исправить проблему, код должен быть более явным, например ::

int sub = num1[i] - num2[j] - carry;
if (sub >= 0) {
    dif[k] = sub;
    carry = 0;
} else {
    dif[k] = 10 - sub;
    carry = 1;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...