Ошибка при вводе чисел разной длины. Длинная арифметика - C (СИ)
Формулировка задачи:
Помогите разобраться в чем проблема. Прогоняю алгоритм на листочке, вроде бы должно работать, уже какие идеи только не пробовал. Для чисел одинаковой длины вроде бы работает стабильно нормально, а вот если длина разная результат неверный.
Листинг программы
- #include <stdio.h>
- #include <string.h>
- #include <locale.h>
- #include "malloc.h"
- #include "stdlib.h"
- #define MAX_NUMBER_LEN 256
- char number1[MAX_NUMBER_LEN];
- char number2[MAX_NUMBER_LEN];
- int result[MAX_NUMBER_LEN];
- void Summ(const char* number1, const char* number2, int* result, int numlen1, int numlen2)
- {
- int i, radix = 16, add = 0, difference, j, length;
- for (i = 0; i < MAX_NUMBER_LEN; ++i)
- result[i] = 0;
- if (numlen1 >= numlen2)
- length = numlen1;
- else
- length = numlen2;
- difference = abs(numlen1 - numlen2);
- for (i = length, j = 0; i >= 0; --i, j++)
- {
- if (numlen1 > numlen2)
- {
- add = number1[i] + number2[j];
- result[i-1] = add / radix;
- result[i] += add % radix;
- }
- else if (numlen1 == numlen2)
- {
- add = number1[i] + number2[i];
- result[i] = add / radix;
- result[i + 1] += add % radix;
- }
- }
- for (i = 0; i <= length; ++i)
- {
- printf("%X", result[i]);
- }
- printf("\n");
- }
- void CharToHex(char* number, int numlen)
- {
- int i;
- for (i = 0; i < numlen; i++)
- {
- if (number[i] >= '0' && number[i] <= '9')
- number[i] = number[i] - '0';
- else if (number[i] >= 'A' && number[i] <= 'F')
- number[i] = number[i] - 'A' + 10;
- else if (number[i] >= 'a' && number[i] <= 'f')
- number[i] = number[i] - 'a' + 10;
- }
- number[numlen] = '\0';
- }
- int main(void)
- {
- int numlen1, numlen2;
- setlocale(0, "rus");
- memset(number1, 0, MAX_NUMBER_LEN);
- memset(number2, 0, MAX_NUMBER_LEN);
- printf("Enter number1 hex: ");
- gets_s(number1, MAX_NUMBER_LEN);
- printf("Enter number2 hex: ");
- gets_s(number2, MAX_NUMBER_LEN);
- numlen1 = strlen(number1);
- numlen2 = strlen(number2);
- number1[numlen1] = '\0';
- number2[numlen2] = '\0';
- CharToHex(number1, numlen1);
- CharToHex(number2, numlen2);
- printf("number1 + number2 = ");
- Summ(number1, number2, result, numlen1, numlen2);
- return 0;
- }
Решение задачи: «Ошибка при вводе чисел разной длины. Длинная арифметика»
textual
Листинг программы
- if (numlen1 > numlen2)
- {
- add = number1[i] + number2[j];
- result[i-1] = add / radix;
- result[i] += add % radix;
- }
- else if (numlen1 == numlen2)
- {
- add = number1[i] + number2[i];
- result[i] = add / radix;
- result[i + 1] += add % radix;
- }
Объяснение кода листинга программы
В данном коде происходит сложение двух чисел, представленных в двоичной системе счисления.
- Первое число number1, представленное массивом длиной numlen1.
- Второе число number2, представленное массивом длиной numlen2.
- Если 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.
- Если 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.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д