О «переводе в десятичную систему счисления»

15.05.2021

В теме про системы счисления люди очень частно используют термин «десятичная система счисления» не совсем правильно.

Например, в задаче Universal convertor надо перевести число из одной системы счисления с заданным основанием в другую. Наиболее простой способ это сделать (если числа не очень большие) — сначала перевести заданное число в тип int или тому подобный, потом перевести полученное значение в целевую систему счисления.

Код получается типа такого (тут я для простоты считаю, что оба основания систем счисления не превышают 10, и вообще код я не тестировал, но для иллюстрации сойдет):

sum = 0
for ch in s[::-1]:
    t = ord(ch) - '0'
    sum += t * d
    d *= n
// теперь в sum заданое число
while sum != 0:
    s2 = sum % k
    sum /= k
    ans = ans + chr(s2 + ord('0'))
print(ans[::-1])

И почему-то многие называют первый цикл «переводом в десятичную систему», а второй цикл — «переводом из десятичной системы».

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

Код же выше ничего подобного не делает, он представляет число во внутреннем формате языка программирования, в переменной типа int. В терминах этих задач это не есть представление в какой-либо системе счисления. Это представление в каком-то внутреннем формате, и в рамках этих (и многих других) задач можно считать, что этот формат — это какой-то черный ящик; нам совершенно не важно, как там хранится число, в какой системе счисления (а важно лишь то, что мы можем с ним выполнять арифметические действия).

Если уж очень вникать в детали, то можно считать, что это двоичная система счисления (потому что компьютер так хранит числа), но уж точно не десятичная! Да и двоичной системой счисления это можно назвать с большой натяжкой — как минимум в соседних задачах, где действительно надо работать с двоичной системой счисления, все всегда работают с массивом двоичных цифр.

Очевидно, десятичной системой счисления это называют лишь потому, что при вводе-выводе таких чисел используется десятичная система. Ну так это не особенность формата, а особенность именно ввода-вывода. Когда вы выводите такое число на экран, язык его конвертирует в десятичную систему счисления. Но пока вы его никуда не выводите, такие фразы довольно бессмысленны. Говорите «переводим во внутренний формат», ну или «в int».


Мой курс по алгоритмическому программированию (и подготовке к олимпиадам) для школьников, студентов и всех желающих — algoprog.ru