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


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