在数字基数之间转换数字

时间:2011-02-04 02:34:12

标签: numbers radix

我正在开发一个在数字基础之间进行转换的程序。例如,八进制是8,十进制是10.字母AZ可以被视为基数26.

我希望将“A”之类的数字转换为0,将Z转换为25,将“AA”转换为27,将“BA”转换为53.

在我开始编码之前,我是在纸上做的,所以我理解这个过程。首先,我试图将533转换为26。

最适合这样做的算法是什么?

4 个答案:

答案 0 :(得分:3)

您需要为每个字母指定一个“数字”,例如:

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 * 262 + A * 261 + X * 260

  (15 * 676) + (0 * 26) + 23
= 10140      + 0        + 23
= 10163

答案 1 :(得分:2)

让我们退后一步,看十进制。

像“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映射到我们的数字集中的最后一个字符。

答案 2 :(得分:0)

您将20和13转换为基数26表示法中代表20和13的符号。听起来你正在使用字母表中的字母,那就是UN(其中A是0,Z是25)。

答案 3 :(得分:0)

你用什么语言写这个?如果你在Perl中这样做,你可以使用多年前我写的无聊的CPAN模块Math :: Fleximal。如果你使用的是具有无限精度整数的语言,那么生活就会变得容易多了。您所要做的就是获取字符,将它们转换为整数数组,然后进行计算以将其转换为数字。