将整数转换为基数26,使用a到z作为数字

mba*_*jur 3 ruby math decimal number-systems

我需要实现一个十进制到字符转换器.我有26个字符可用,所以它是关于将整数转换为基数为26的系统,然后将每个数字更改为它的字母表对应物.我不想在最终结果字符串中使用字符0-9.我可以使用to_s()方法,这是怎么回事:

82.to_s(26)  #=> "34" / which gives me "de"
120.to_s(26)  #=> "4g" / which should give me "aep", but it's not
Run Code Online (Sandbox Code Playgroud)

Ruby to_s()方法以一种无用的格式返回一个值.数字82转换得很好,但120的转换返回一个我不知道如何处理的值.

任何人都可以解释我如何使120转换(例如)返回aep等效?换句话说,如何从十进制基数转换为26但不使用输出中的数字?

Nei*_*ter 12

Ruby Fixnum#to_s( base )String#to_i( base )用于表示不同基数的数字.但是,您不能使用任意字符,它们的设计与hex和base64的约定兼容.

如果你没有转换到不同的基础,只是将十进制数字编码为字母和背面,那么只需要一个简单的替换:

46.to_s.tr( "0123456789", "abcdefghijk" )
=> "eg"

"eg".tr( "abcdefghijk", "0123456789" ).to_i
=> 46
Run Code Online (Sandbox Code Playgroud)

因此,如果您想同时执行这两项操作,并使用az表示基数为26的数字:

46.to_s(26).tr( "0123456789abcdefghijklmnopq", "abcdefghijklmnopqrstuvwxyz" )
=> "bu"

"bu".tr( "abcdefghijklmnopqrstuvwxyz", "0123456789abcdefghijklmnopq" ).to_i(26)
=> 46
Run Code Online (Sandbox Code Playgroud)

  • 注意,在这个系统中,"a"代表"0",所以无论你在字符串前加上""a"没有区别,都应该省略.字符"a"不应该显示为最左边的字符. (2认同)