Ошибка при вводе чисел разной длины. Длинная арифметика - 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.