Перевести десятичное число в данную систему счисления

Задача

Вводится десятичное число и система счисления (СС), вывести это число в данной системе счисления.

Решение

 

Описание переменных: 

  • n - число в десятичной СС;
  • r - система счисления;
  • d - очередная цифра числа, начиная с конца;
  • с - очередная цифра числа в строковом представлении;
  • s - число в указанной СС в строковом представлении.

Алгоритм решения задачи: 

Для того, чтобы выразить число в любой системе счисления до n, потребуется n-1 различных символов. Выражая числа в СС до 10 включительно используются символы-цифры. Для шеснадцатеричной СС используются английские буквы до F включительно. Точно также можно использовать символы-буквы для любой другой системы счисления с основанием больше 10. Однако букв в английском алфавите 26, значит максимальное основание СС в таком случае будет 26 (букв) + 10 (цифр) = 36. Конечно, можно использовать еще какие-либо символы и таким образом увеличить основание СС.

В задаче ниже заданная система счисления не может быть больше 36. Кроме того, в комментариях представлен вариант решения для СС до 16 включительно (в этом случае надо закомментировать строку c := chr(ord('A') + (d - 10))) с использованием константы-массива. Такой способ может быть более очевидным, так как не предполагает зависимости от таблицы кодировки символов.

Для представления десятичного числа в заданной системе счисления надо последовательно делить это число на основание СС и "собирать" остатки от деления в новое число так, чтобы первый остаток стоял последним, а последний первым, т. е. производить сборку остатков начиная с конца. Деление следует производить до тех пор, пока исходное число не станет равным нулю.

В программе до начала деления в цикле создается пустая строка. В нее будет записываться очередная цифра-символ числа в данной СС. В теле цикла сначала находится остаток от деления десятичного числа на основание указанной СС. Если СС больше 10 до остаток может быть больше 10 и, следовательно, число-остаток следует заменить на букву, обозначающую цифру в этой СС.

Если используется константа-массив с индексацией от 10 до n-1, то число заменяется на букву просто: буква извлекается по индексу, который является числом-остатком. Если же используется участок таблица кодировки символов, то надо к коду первой используемой буквы прибавить разность между остатком и числом 10 (т. к. первая буква обозначает число 10 в данной СС). Далее полученный результат переводится в символ.

Если полученный остаток был числом до 10, то он переводится в строку-цифру с помощью функции str().

Поскольку сборка нового числа производится с конца (т.е. сначала находятся последние его цифры), то каждую новую цифру следует приписывать в начало строки.

В цикле также необходимо разделить нацело исходное число на основание данной СС.

Программа на языке Паскаль: 

 

//const alph: array [10..15] of char = ('A','B','C','D','E','F');
var
    n: longint;
    r, d: byte;
    s: string;
    c: string[1];
begin
    write('Число: ');
    readln(n);
    write('СС (до 36 включительно): ');
    readln(r);
 
    if (r > 36) or (r < 2) then exit;
 
    s := '';
    while n > 0 do begin
        d := n mod r;
        if d > 9 then
            //c := alph[d]
            c := chr(ord('A') + (d - 10))
        else
            str(d,c);
        s := c + s;
        n := n div r;
    end;
 
    writeln(s);
 
end.

 

Примеры выполнения программы:

Число: 16
СС (до 36 включительно): 2
10000
Число: 35
СС (до 36 включительно): 36
Z
Число: 567
СС (до 36 включительно): 32
HN
Число: 1000
СС (до 36 включительно): 12
6B4

 

Тема

Строки

Уровень

Комбинированные задачи

Добавить комментарий