Загрузка данных


#include <stdio.h>
#include <string.h>
#include <ctype.h>

// Преобразует hex символ в число (0-15)
int hex_to_int(char c) {
    if (c >= '0' && c <= '9') return c - '0';
    if (c >= 'a' && c <= 'f') return c - 'a' + 10;
    if (c >= 'A' && c <= 'F') return c - 'A' + 10;
    return 0;
}

// Преобразует число (0-15) в hex символ
char int_to_hex(int n) {
    if (n < 10) return '0' + n;
    return 'a' + (n - 10);
}

// Умножение двух чисел в hex строке (как строки в обратном порядке)
void multiply_hex_strings(const char* a, const char* b, char* result) {
    int len_a = strlen(a);
    int len_b = strlen(b);
    int result_len = len_a + len_b;
    
    // Массив для хранения промежуточных результатов
    int* temp = (int*)calloc(result_len, sizeof(int));
    
    // Умножение цифр
    for (int i = len_a - 1; i >= 0; i--) {
        int digit_a = hex_to_int(a[i]);
        for (int j = len_b - 1; j >= 0; j--) {
            int digit_b = hex_to_int(b[j]);
            int pos = (len_a - 1 - i) + (len_b - 1 - j);
            temp[pos] += digit_a * digit_b;
        }
    }
    
    // Обработка переносов
    for (int i = 0; i < result_len - 1; i++) {
        temp[i + 1] += temp[i] / 16;
        temp[i] %= 16;
    }
    
    // Удаляем ведущие нули
    int start = result_len - 1;
    while (start > 0 && temp[start] == 0) {
        start--;
    }
    
    // Преобразуем в строку
    for (int i = 0; i <= start; i++) {
        result[start - i] = int_to_hex(temp[i]);
    }
    result[start + 1] = '\0';
    
    free(temp);
}

int main() {
    const char* a = "2304a7cc89bd0035ff";
    const char* b = "561ab28ff7c6779400";
    char result[256];
    
    multiply_hex_strings(a, b, result);
    
    printf("a = %s\n", a);
    printf("b = %s\n", b);
    printf("\nРезультат умножения a * b:\n%s\n", result);
    
    return 0;
}