Преобразование чисел между номерами - PullRequest
4 голосов
/ 04 февраля 2011

Я работаю над программой, которая конвертирует базы чисел.Например, Octal - это 8, десятичное - 10. Буквы от A до Z могут рассматриваться как основание 26.

Я хочу преобразовать число типа «A» в 0, Z в 25, «AA"в 27 и" BA "в 53.

Прежде чем я начну кодировать, я делаю это на бумаге, чтобы понять процесс.Для начала я пытаюсь преобразовать 533 в базу 26.

Какой алгоритм лучше всего подходит для этого?

Ответы [ 4 ]

3 голосов
/ 04 февраля 2011

Вам необходимо присвоить «цифру» каждой букве, например:

A =  0     N = 13
B =  1     O = 14
C =  2     P = 15
D =  3     Q = 16
E =  4     R = 17
F =  5     S = 18
G =  6     T = 19
H =  7     U = 20
I =  8     V = 21
J =  9     W = 22
K = 10     X = 23
L = 11     Y = 24
M = 12     Z = 25

Тогда ваш {20,13} становится UN.

Преобразование обратно UN -> {20,13} -> (20 * 26 + 13) -> 52.

В качестве еще одного примера, давайте попробуем число 10163, только что случайно вырванное из воздуха.

Делите это на 26, пока не получите число меньше 26 (то есть дважды), и вы получите 15 с дробной частью 0,03402366.

Умножьте это на 26, и вы получите 0 с дробной частью 0,88461516.

Умножьте на на 26, и вы получите 23 (на самом деле 22.99999416 на моем калькуляторе, но, поскольку первоначальное деление было только двумя шагами, мы остановимся здесь - очень небольшая неточность к тому, что числа с плавающей точкой округляются).

Таким образом, «цифры» - это {15,0,23}, что является «числом» PAX. Вау, какое совпадение?

Чтобы преобразовать PAX обратно в десятичное число, его

P * 26<sup>2</sup> + A * 26<sup>1</sup> + X * 26<sup>0</sup>

или

  (15 * 676) + (0 * 26) + 23
= 10140      + 0        + 23
= 10163
2 голосов
/ 04 февраля 2011

Давайте сделаем шаг назад на секунду и посмотрим на десятичное число.

Что означает число типа "147"? Или, скорее, что обозначают символы «1», «4» и «7», когда расположены таким образом?

Десятичное число состоит из десяти цифр, и после этого мы добавляем еще одну цифру слева от первой и т. Д. По мере увеличения нашего числа. Таким образом, после «9» = 9 * 1 мы получаем «10» = 1 * 10 + 0 * 1. Таким образом, «147» равно 1 * 10 ^ 2 + 4 * 10 + 7 * 1 = 147. Аналогично, мы можем вернуться назад - 147/10 ^ 2 = 1, что соответствует символу «1». (147% 10 ^ 2) / 10 = 4, что соответствует символу «4». И 147% 10 = 7, что соответствует символу «7».

Это работает для любой базовой N - если мы получим число 0, это будет соответствовать первому символу в нашем наборе. Число 1 отображается на второй символ и так далее, пока число N-1 не отобразится на последний символ в нашем наборе цифр.

0 голосов
/ 04 февраля 2011

На каком языке вы пишете это? Если вы делаете это в Perl, вы можете использовать модуль CPAN Math :: Fleximal, который я написал много лет назад, когда мне было скучно. Если вы используете язык с целочисленной точностью, жизнь становится намного проще. Все, что вам нужно сделать, это взять символы, преобразовать их в массив целых чисел, а затем выполнить вычисления, чтобы превратить их в число.

0 голосов
/ 04 февраля 2011

Вы конвертируете 20 и 13 в символы, которые представляют 20 и 13 в ваших основных 26 обозначениях.Звучит так, будто вы используете буквы алфавита, так что это будет UN (где A равно 0, а Z равно 25).

...