Ошибка при вводе чисел разной длины. Длинная арифметика - 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.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д