#include <stdio.h>
#include <string.h> // Для работы со строками (переворот результата)
// Функция 1: Преобразование числа и получение строки результата
// Принимает: число для перевода, основание системы счисления, строку для записи ответа
void convertNumber(int number, int base, char result[]) {
// Массив символов для цифр больше 9 (A, B, C, D, E, F)
char digits[] = "0123456789ABCDEF";
// Временный массив для хранения остатков в обратном порядке
char temp[65];
int index = 0; // Счетчик для записи в массив temp
// Обрабатываем случай, когда число равно 0
if (number == 0) {
result[0] = '0';
result[1] = '\0'; // Конец строки
return;
}
// Алгоритм: делим число на основание, пока оно больше 0
while (number > 0) {
int remainder = number % base; // 1. Получаем остаток от деления
temp[index] = digits[remainder]; // 2. Записываем символ, соответствующий остатку
index++; // 3. Двигаем указатель
number = number / base; // 4. Уменьшаем число (делим на основание)
}
temp[index] = '\0'; // Завершаем временную строку
// Переворачиваем строку temp в result, так как остатки записаны с конца
int j = 0;
for (int i = index - 1; i >= 0; i--) {
result[j] = temp[i];
j++;
}
result[j] = '\0'; // Завершаем итоговую строку
}
// Функция 2: Проверка корректности ввода основания системы счисления
// Возвращает 1, если основание от 2 до 16, иначе 0
int isValidBase(int base) {
if (base >= 2 && base <= 16) {
return 1;
} else {
printf("Ошибка: Основание должно быть от 2 до 16.\n");
return 0;
}
}
int main() {
int decimalNumber;
int base;
char finalResult[65]; // Строка для хранения итогового числа
printf("=== ПРЕОБРАЗОВАТЕЛЬ СИСТЕМ СЧИСЛЕНИЯ ===\n");
// Запрос десятичного числа
printf("Введите целое десятичное число: ");
scanf("%d", &decimalNumber);
// Проверка на отрицательное число (программа для простоты работает с положительными)
if (decimalNumber < 0) {
printf("Программа работает только с положительными числами.\n");
return 1;
}
// Запрос основания с проверкой
do {
printf("Введите основание новой системы счисления (2-16): ");
scanf("%d", &base);
} while (!isValidBase(base)); // Повторяем, пока основание не станет правильным
// Вызов первой функции для выполнения перевода
convertNumber(decimalNumber, base, finalResult);
// Вывод результата
printf("\nЧисло %d в %d-ричной системе счисления = %s\n", decimalNumber, base, finalResult);
return 0;
}