0

さまざまな基数で最大 64 ビットの符号なし値を表現しようとしています。

ベース 2 (バイナリ) の場合、64 個の 1 になります。

    1111111111111111111111111111111111111111111111111111111111111111

基数 16 (hex) の場合、16 F になります。

    FFFFFFFFFFFFFFFF

基数 10 (10 進数) の場合は次のようになります。

    18446744073709551615

この値の表現を base 36 で取得しようとしています (0-9 と AZ を使用します)。多くのオンライン ベース コンバーターがありますが、それらはすべて 64 ビット演算によって制限されているため、正しい表現を生成できません。

DC (無制限の大きさの数を処理できる非常に使いにくい文字列演算プロセッサ) の使用方法を知っていて、この変換の方法を知っている人はいますか? それか、整数のロールオーバーが原因で失敗しない電卓でこの変換を実行する方法を教えてもらえますか?

4

3 に答える 3

4

ルビーで簡単なテストを行いました:

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

Bignumのドキュメントから:

Bignum オブジェクトは、Fixnum の範囲外の整数を保持します。Bignum オブジェクトは、整数計算で Fixnum がオーバーフローする場合に自動的に作成されます。Bignum オブジェクトを含む計算が Fixnum に収まる結果を返す場合、結果は自動的に変換されます。

于 2012-05-11T18:31:42.787 に答える
0
  1. 任意の大きさの整数を処理できる任意の言語を取得します。Ruby、Python、Haskell、あなたはそれに名前を付けます。
  2. 基本的な手順を実装します。モジュロ36は次の桁を示し、36で除算すると、最後の桁が切り取られた数値が得られます。
  3. 数字を好きなように文字にマップします。たとえば、 '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'[digit]私は大丈夫です。数字を生成するときに、結果に数字を追加します。
  4. ???
  5. 連結された数字の文字列を返します。利益!
于 2012-05-11T19:01:19.610 に答える