#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;
}