http://neonohoret.livejournal.com/ ([identity profile] neonohoret.livejournal.com) wrote in [community profile] useless_faq2011-07-15 05:55 pm

Математическое

После ВУЗа матиматика успела залечь в спячку где-то далеко на подкорке, но пару месяцев назад в комментариях всплыла тема про системы счисления.


Мне не понятно было тогда и не совсем понятно сейчас, почему при обучении переводу из одной системы в другую используют различные алгоритмы и методы, когда, хотя в случае с десятичной системой всё можно привести к общему виду.
То есть формулу для перевода из любой системы в десятичную из десятичной в любую я на первом курсе вывел на коленке чисто эмперически:


(p и  q - основания систем счисления, [ ] - взятие целой части)

P.S. Алгоритмы, понятное дело, экономят машинное время, но как же красота и завершенность?

[identity profile] mercury13-kiev.livejournal.com 2011-07-16 09:15 am (UTC)(link)
Говорю сразу: я не проверял, верна ли формула. Есть два возражения по существу.

Перевод систем счисления бывает двух видов: "любая - родная" и "любая - любая". Под "родной" понимается система, в которой компьютер складывает и умножает - будь она двоичной, фибоначчиевой или ещё какой-то. Первое употребляется чаще: всегда, когда надо вывести десятичное число на экран, вызывается именно процедура перевода чисел из внутреннего формата компьютера в десятичный. Итак, ОДИН: во внутреннем формате нет цифр. И нет команды "вытащить из числа третью цифру". Можно сложить, вычесть, умножить и поделить. Целиком.

ДВА. Теперь поговорим о переводе из любой в любую. Обычно такое, без перевода в родную, делают для очень длинных чисел, которых никакой регистр не вместит. При вычислении по вашей формуле сложность кубическая: для каждой цифры нужно делить на длинное число, операция квадратичная, к тому же программирующаяся очень тяжело. Длина числа вдвое - объём работы в восемь раз. Если сделать наскоком - просто в лоб выполнять операции в одной из систем счисления - нам потребуются совмещённая операция "умножение-сложение" с коротким множителем (long + long*short) и деление с остатком, снова-таки на короткое число. Операции элементарные, а сложность всего лишь квадратичная.

[identity profile] mercury13-kiev.livejournal.com 2011-07-16 09:17 am (UTC)(link)
Пардон, short + long*short. Даже проще!