Загрузка данных
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
// Преобразует hex символ в число
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;
}
// Преобразует число в hex символ
char int_to_hex(int n) {
if (n < 10) return '0' + n;
return 'a' + (n - 10);
}
// Сравнение двух hex строк как чисел
int compare_hex(const char* a, const char* b) {
int len_a = strlen(a);
int len_b = strlen(b);
if (len_a != len_b) return len_a - len_b;
for (int i = 0; i < len_a; i++) {
if (a[i] != b[i]) return hex_to_int(a[i]) - hex_to_int(b[i]);
}
return 0;
}
// Вычитание hex строк: result = a - b (предполагается a >= b)
void subtract_hex(const char* a, const char* b, char* result) {
int len_a = strlen(a);
int len_b = strlen(b);
int len_result = len_a;
int* digits = (int*)calloc(len_result, sizeof(int));
for (int i = 0; i < len_a; i++) {
digits[i] = hex_to_int(a[i]);
}
// Вычитание с заёмами
int borrow = 0;
for (int i = len_a - 1, j = len_b - 1; i >= 0; i--, j--) {
int sub = (j >= 0) ? hex_to_int(b[j]) : 0;
digits[i] = digits[i] - sub - borrow;
if (digits[i] < 0) {
digits[i] += 16;
borrow = 1;
} else {
borrow = 0;
}
}
// Удаляем ведущие нули
int start = 0;
while (start < len_result - 1 && digits[start] == 0) {
start++;
}
// Формируем результат
for (int i = start; i < len_result; i++) {
result[i - start] = int_to_hex(digits[i]);
}
result[len_result - start] = '\0';
free(digits);
}
// Деление hex строк: quotient = b / a, remainder = b % a
void divide_hex(const char* a, const char* b, char* quotient, char* remainder) {
char temp[512];
char current[512] = "";
int quotient_pos = 0;
// Деление столбиком
for (int i = 0; i < strlen(b); i++) {
// Добавляем следующую цифру
int len = strlen(current);
current[len] = b[i];
current[len + 1] = '\0';
// Удаляем ведущие нули
int start = 0;
while (current[start] == '0' && current[start + 1] != '\0') {
start++;
}
if (start > 0) {
for (int j = start; j <= len; j++) {
current[j - start] = current[j];
}
}
// Находим максимальную цифру частного
int digit = 0;
char multiplied[512];
while (1) {
char next_digit[2] = {int_to_hex(digit + 1), '\0'};
// Умножаем a на next_digit (упрощённо, только для однозначных чисел)
// Здесь просто проверяем, не превышает ли произведение current
// Для простоты используем сравнение строк
if (compare_hex(current, a) >= 0) {
subtract_hex(current, a, current);
digit++;
} else {
break;
}
}
quotient[quotient_pos++] = int_to_hex(digit);
}
quotient[quotient_pos] = '\0';
// Убираем ведущие нули из частного
int start = 0;
while (quotient[start] == '0' && quotient[start + 1] != '\0') {
start++;
}
if (start > 0) {
for (int i = start; i <= quotient_pos; i++) {
quotient[i - start] = quotient[i];
}
}
// Остаток — это current
strcpy(remainder, current);
if (strlen(remainder) == 0) {
strcpy(remainder, "0");
}
}
int main() {
const char* a = "2304a7cc89bd0035ff";
const char* b = "561ab28ff7c6779400";
char quotient[512];
char remainder[512];
divide_hex(a, b, quotient, remainder);
printf("a = %s\n", a);
printf("b = %s\n", b);
printf("\nРезультат деления b / a:\n%s\n", quotient);
printf("\nОстаток:\n%s\n", remainder);
return 0;
}