【问题标题】:How to convert a large number to base 36 using DC or other如何使用 DC 或其他方法将大数转换为 base 36
【发布时间】:2012-05-20 08:43:04
【问题描述】:

我正在尝试以不同的基数表示最大 64 位无符号值。

对于基数 2(二进制),它将是 64 个 1:

    1111111111111111111111111111111111111111111111111111111111111111

对于基数 16(十六进制),它将是 16 F

    FFFFFFFFFFFFFFFF

对于基数 10(十进制),它将是:

    18446744073709551615

我正在尝试以 36 为基数来表示此值(它使用 0-9 和 A-Z)。有许多在线基础转换器,但它们都无法生成正确的表示,因为它们受到 64 位数学的限制。

有谁知道如何使用 DC(这是一种非常难以使用的字符串数学处理器,可以处理无限数量的数字)并且知道如何进行这种转换?或者任何人都可以告诉我如何使用不会因整数翻转而失败的计算器执行此转换?

【问题讨论】:

  • 我不明白你最后的段落。 DC 是什么意思?
  • DC 是在 C 编程语言发明之前用汇编语言编写的程序。它是“桌面计算器”的缩写。不幸的是,使用它就像在汇编中编程一样难,因为您必须手动加载和弹出操作数进出寄存器以及各种疯狂的东西。它让我难以想象,但它是迄今为止我所知道的最强大的数学处理器。
  • 感谢您的信息。现在我也在wikipedia 找到了它

标签: numbers 64-bit dc


【解决方案1】:

我用 ruby​​ 进行了一次快速测试:

i = 'FFFFFFFFFFFFFFFF'.to_i(16)
puts i               #18446744073709551615
puts i.to_s(36)      #3w5e11264sgsf

您也可以使用更大的数字:

i = 'FFFFFFFFFFFFFFFF'.to_i(16) ** 16
puts i                  
puts i.to_s(36)      

结果:

179769313486231590617005494896502488139538923424507473845653439431848569886227202866765261632299351819569917639009010788373365912036255753178371299382143631760131695224907130882552454362167933328609537509415576609030163673758148226168953269623548572115351901405836315903312675793605327103910016259918212890625
1a1e4vngailcqaj6ud31s2kk9s94o3tyofvllrg4rx6mxa0pt2sc06ngjzleciz7lzgdt55aedc9x92w0w2gclhijdmj7le6osfi1w9gvybbfq04b6fm705brjo535po1axacun6f7013c4944wa7j0yyg93uzeknjphiegfat0ojki1g5pt5se1ylx93knpzbedn29

简要说明大数字会发生什么:

正常数字是Fixnums。如果您获得更大的数字,则该数字将变为Bignum

small = 'FFFFFFF'.to_i(16)
big = 'FFFFFFFFFFFFFFFF'.to_i(16) ** 16

puts "%i is a %s" % [ small, small.class ]
puts "%i\n is a %s" % [ big, big.class ]
puts "%i^2 is a %s" % [ small, (small ** 2).class ]

结果:

268435455 is a Fixnum
179769313486231590617005494896502488139538923424507473845653439431848569886227202866765261632299351819569917639009010788373365912036255753178371299382143631760131695224907130882552454362167933328609537509415576609030163673758148226168953269623548572115351901405836315903312675793605327103910016259918212890625
 is a Bignum
268435455^2 is a Bignum

来自documentation of Bignum

Bignum 对象包含 Fixnum 范围之外的整数。当整数计算会溢出 Fixnum 时,会自动创建 Bignum 对象。当涉及 B​​ignum 对象的计算返回适合 Fixnum 的结果时,该结果将自动转换。

【讨论】:

  • 是的,我认为这是正确的答案。我真的不能说,但由于十六进制到十进制的值是正确的,我认为 base36 的十六进制也是正确的。我想知道红宝石是怎么做到的!在第二个示例中,该值会导致大多数语言中的整数溢出。
  • 我添加了一个关于 ruby​​ 的简短说明Bignum
【解决方案2】:

用dc也可以,但是输出用处不是很大。

$ dc
36
o
16
i
FFFFFFFFFFFFFFFF
p
 03 32 05 14 01 01 02 06 04 28 16 28 15

解释如下:

单独输入一个数字会推动该数字

o 弹出堆栈并设置输出基数。

i 弹出堆栈并设置输入基数。

p 以当前输出基数打印堆栈顶部的数字。但是,dc 将任何基数高于 16 的输出打印为二进制(不是 ASCII)。

在 dc 中,命令可能都放在同一行,如下所示:

$ dc
36o16iFFFFFFFFFFFFFFFFp
 03 32 05 14 01 01 02 06 04 28 16 28 15

【讨论】:

  • 很棒的解释。谢谢
【解决方案3】:
  1. 获取任何可以处理任意大整数的语言。 Ruby、Python、Haskell,应有尽有。
  2. 实现基本步骤:模 36 得到下一位,除以 36 得到去掉最后一位的数字。
  3. 按照您喜欢的方式将数字映射到字符。例如,'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'[digit] 对我来说很好。在生成结果时将数字附加到结果中。
  4. ???
  5. 返回连接的数字字符串。利润!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-10
    • 2015-04-09
    • 1970-01-01
    • 2014-11-22
    • 1970-01-01
    • 1970-01-01
    • 2015-07-29
    • 1970-01-01
    相关资源
    最近更新 更多