Сложение и вычитание длинных чисел на СИ

Рейтинг: 0Ответов: 0Опубликовано: 13.07.2023

Нужно написать сложение и вычитание длинных чисел, заданных при вводе строкой через 16ричную систему счисления. Я написала перевод в 10ричную систему, для разложения по частям в массив. Теперь не знаю, как написать сложение и вычитание, учитывая знак. Проблема состоит в том, чтоб переносить значения "в уме" в следующий элемент массива, например если у нас обычное число 123 + 921 = 1044, и в один элемент массива бы записалось 1, а в следующий 044. Помогите, пожалуйста (

typedef struct BigInt
{
    unsigned int* arr;
    int arr_size;
    int sign;
}BigInt;

BigInt* translate(char* str)
{
    BigInt* res = (BigInt*)malloc(sizeof(BigInt));
    res->arr_size = 0;
    res->sign = 1;
    if (str[0] == '-')
    {
        res->sign = -1;
        str++;
    }
    if (strlen(str) % 8 != 0)
        res->arr_size = strlen(str) / 8 + 1;
    else
        res->arr_size = strlen(str) / 8;
    res->arr = (unsigned int*)malloc(sizeof(unsigned int) * res->arr_size);
    memset(res->arr, 0, res->arr_size);

    unsigned int result = 0;

    int j = res->arr_size - 1;
    int k = 0;
    for (int i = strlen(str) - 1; i >= 0; i--)
    {
        int symbol = 0;
        if (str[i] >= '0' && str[i] <= '9')
            symbol = str[i] - '0';
        else if (str[i] >= 'A' && str[i] <= 'F')
            symbol = str[i] - 'A' + 10;
        else {
            printf_s("Invalid character encountered");
            system("pause");
            return 0;
        }
        result |= symbol << ((k % 8) * 4);
        if ((k % 8 == 0) && (k != 0))
        {
            res->arr[j] = result;
            j--;
            result = 0;
        }
        k++;
    }
    if (k % 8 != 0)
    {
        res->arr[j] = result;
        j--;
        result = 0;
    }

    return res;
}

void print_big_int(BigInt* big_int)
{
    int size = big_int->arr_size;
    if (big_int->sign == -1)
        printf_s("-");
    for (int i = 0; i < size; i++)
    { 
        printf_s("%X", big_int->arr[i]);
    }
}

BigInt* adding(BigInt* first, BigInt* second)
{
    BigInt* result = (BigInt*)malloc(sizeof(BigInt));
    if (first->arr_size >= second->arr_size)
        result->arr_size = first->arr_size + 1;
    else if (second->arr_size > first->arr_size)
        result->arr_size = second->arr_size + 1;
    result->arr = (unsigned int*)malloc(sizeof(unsigned int) * (result->arr_size));

    if (first->sign == second->sign)
        result->sign = first->sign;

    return NULL;
}

Ответы

Ответов пока нет.