Ошибка при вводе чисел разной длины. Длинная арифметика - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Помогите разобраться в чем проблема. Прогоняю алгоритм на листочке, вроде бы должно работать, уже какие идеи только не пробовал. Для чисел одинаковой длины вроде бы работает стабильно нормально, а вот если длина разная результат неверный.
Листинг программы
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <locale.h>
  4. #include "malloc.h"
  5. #include "stdlib.h"
  6. #define MAX_NUMBER_LEN 256
  7. char number1[MAX_NUMBER_LEN];
  8. char number2[MAX_NUMBER_LEN];
  9. int result[MAX_NUMBER_LEN];
  10. void Summ(const char* number1, const char* number2, int* result, int numlen1, int numlen2)
  11. {
  12. int i, radix = 16, add = 0, difference, j, length;
  13. for (i = 0; i < MAX_NUMBER_LEN; ++i)
  14. result[i] = 0;
  15. if (numlen1 >= numlen2)
  16. length = numlen1;
  17. else
  18. length = numlen2;
  19. difference = abs(numlen1 - numlen2);
  20. for (i = length, j = 0; i >= 0; --i, j++)
  21. {
  22. if (numlen1 > numlen2)
  23. {
  24. add = number1[i] + number2[j];
  25. result[i-1] = add / radix;
  26. result[i] += add % radix;
  27. }
  28. else if (numlen1 == numlen2)
  29. {
  30. add = number1[i] + number2[i];
  31. result[i] = add / radix;
  32. result[i + 1] += add % radix;
  33. }
  34. }
  35. for (i = 0; i <= length; ++i)
  36. {
  37. printf("%X", result[i]);
  38. }
  39. printf("\n");
  40. }
  41.  
  42. void CharToHex(char* number, int numlen)
  43. {
  44. int i;
  45. for (i = 0; i < numlen; i++)
  46. {
  47. if (number[i] >= '0' && number[i] <= '9')
  48. number[i] = number[i] - '0';
  49. else if (number[i] >= 'A' && number[i] <= 'F')
  50. number[i] = number[i] - 'A' + 10;
  51. else if (number[i] >= 'a' && number[i] <= 'f')
  52. number[i] = number[i] - 'a' + 10;
  53. }
  54. number[numlen] = '\0';
  55. }
  56. int main(void)
  57. {
  58. int numlen1, numlen2;
  59. setlocale(0, "rus");
  60. memset(number1, 0, MAX_NUMBER_LEN);
  61. memset(number2, 0, MAX_NUMBER_LEN);
  62. printf("Enter number1 hex: ");
  63. gets_s(number1, MAX_NUMBER_LEN);
  64. printf("Enter number2 hex: ");
  65. gets_s(number2, MAX_NUMBER_LEN);
  66. numlen1 = strlen(number1);
  67. numlen2 = strlen(number2);
  68. number1[numlen1] = '\0';
  69. number2[numlen2] = '\0';
  70. CharToHex(number1, numlen1);
  71. CharToHex(number2, numlen2);
  72. printf("number1 + number2 = ");
  73. Summ(number1, number2, result, numlen1, numlen2);
  74. return 0;
  75. }

Решение задачи: «Ошибка при вводе чисел разной длины. Длинная арифметика»

textual
Листинг программы
  1.     if (numlen1 > numlen2)
  2.     {
  3.         add = number1[i] + number2[j];
  4.         result[i-1] = add / radix;
  5.         result[i] += add % radix;
  6.     }
  7.     else if (numlen1 == numlen2)
  8.     {
  9.         add = number1[i] + number2[i];
  10.         result[i] = add / radix;
  11.         result[i + 1] += add % radix;
  12.     }

Объяснение кода листинга программы

В данном коде происходит сложение двух чисел, представленных в двоичной системе счисления.

  1. Первое число number1, представленное массивом длиной numlen1.
  2. Второе число number2, представленное массивом длиной numlen2.
  3. Если numlen1 > numlen2, то выполняется следующая последовательность действий:
    • Начинается с i = 0 для первого числа и j = 0 для второго числа.
    • Пока i меньше или равно numlen1 и j меньше или равно numlen2 выполняется следующее:
      • add = number1[i] + number2[j].
      • result[i-1] = add / radix.
      • result[i] += add % radix.
    • После выполнения всех условий, результат сохраняется в массиве result.
  4. Если numlen1 = numlen2, то выполняется следующая последовательность действий:
    • Начинается с i = 0 для первого числа и j = 0 для второго числа.
    • Пока i меньше или равно numlen1 и j меньше или равно numlen2 выполняется следующее:
      • add = number1[i] + number2[j].
      • result[i] = add / radix.
      • result[i + 1] += add % radix.
    • После выполнения всех условий, результат сохраняется в массиве result.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 3.933 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы