我正在开发一个在数字基础之间进行转换的程序。例如,八进制是8,十进制是10.字母A
到Z
可以被视为基数26.
我希望将“A”之类的数字转换为0,将Z转换为25,将“AA”转换为27,将“BA”转换为53.
在我开始编码之前,我是在纸上做的,所以我理解这个过程。首先,我试图将533转换为26。
最适合这样做的算法是什么?
答案 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。如果你使用的是具有无限精度整数的语言,那么生活就会变得容易多了。您所要做的就是获取字符,将它们转换为整数数组,然后进行计算以将其转换为数字。