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

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

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

  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
Похожие ответы