fork download
  1. =begin
  2.  
  3. > お題:与えられた正の整数nを2進数~16進数に変換して表示する。
  4. > 11進数以降の10以上を表す文字はABCDEFを使用。
  5. > (10=A, 11=B, 12=C, 13=D, 14=E, 15=F)
  6. > 例:12進数の11 ---> B
  7.  
  8. 整数だと面白くないので実数でやる。
  9. 検査のために逆関数も作っとく。
  10. 2進数~64進数の Base64もどき。
  11.  
  12. # 1/3の3進とか、Piの2進とかやってみたかった。
  13.  
  14. =end
  15.  
  16. Nstr = *'0'..'9', *'A'..'Z', *'a'..'z', '+', '/' # Base64 もどき
  17. Nidx = {}
  18. Nstr.each_with_index{|ch,idx| Nidx[ch] = idx }
  19.  
  20.  
  21. def fbase( bs, n )
  22. return nil if bs < 2 || bs > Nstr.size
  23. str = ''
  24. sgn = (n < 0)? '-' : ''
  25. n = n.abs
  26. fr = n - n.to_i
  27. n = n.to_i
  28. begin
  29. n, r = n.divmod( bs )
  30. str << Nstr[r]
  31. end while n != 0
  32.  
  33. fdig = Math.log( 10 ** 8, bs ).to_i + 1
  34.  
  35. fstr = '.'
  36. begin
  37. fr *= bs
  38. fstr << Nstr[fr.to_i]
  39. fr -= fr.to_i
  40. fdig -= 1
  41. end while fr != 0 && fdig > 0
  42. fstr.sub!( /0+$/, '' )
  43. fstr = '' if fstr == '.'
  44.  
  45. "#{sgn}#{str.reverse}#{fstr}"
  46. end
  47.  
  48. def revfbase( bs, str )
  49. return nil if bs < 2 || bs > Nstr.size
  50. fstr = ''
  51. if str =~ /^(.*)\.(.*)$/
  52. str = $1
  53. fstr = $2
  54. end
  55. sg = 1
  56. if str[0] == '-'
  57. sg = -1
  58. str = str[1..-1]
  59. end
  60. n = 0
  61. m = 1
  62. str.reverse.each_char{|ch|
  63. unless Nidx[ch]
  64. warn "*** #{ch} ***"
  65. return ''
  66. end
  67. n += m * Nidx[ch]
  68. m *= bs
  69. }
  70. m = 1
  71. fstr.each_char{|ch|
  72. unless Nidx[ch]
  73. warn "*** #{ch} ***"
  74. return ''
  75. end
  76. m = m.fdiv(bs)
  77. n += m * Nidx[ch]
  78. }
  79. sg * n
  80. end
  81.  
  82. def ftest( bs, n )
  83. return if bs < 2 || bs > Nstr.size
  84. print "%20s : " % n
  85. ans = fbase( bs, n )
  86. print "#{'%2d' % bs} : #{'%20s' % ans}"
  87. str = revfbase( bs, ans )
  88. print " : #{'%20s' % str}"
  89. if n != str.to_f
  90. print " : #{'%.1e' % [n - str.to_f]}"
  91. end
  92. puts
  93. end
  94.  
  95.  
  96. ftest( 2, 123456 )
  97. ftest( 10, 123456 )
  98. ftest( 16, 123456 )
  99. ftest( 64, 123456 )
  100. ftest( 10, -123456 )
  101. ftest( 2, -123456 )
  102.  
  103. ftest( 2, 0 )
  104. ftest( 2, 2.5 )
  105. ftest( 2, 0.5 )
  106. ftest( 2, 0.25 )
  107. ftest( 2, 0.125 )
  108. ftest( 2, -0.125 )
  109. ftest( 2, 0.75 )
  110.  
  111. ftest( 2, 1.41421356 )
  112. ftest( 2, 3.1415926 )
  113. ftest( 3, 3.1415926 )
  114. ftest( 10, 3.1415926 )
  115. ftest( 16, 3.1415926 )
  116. ftest( 64, 3.1415926 )
  117.  
  118. ftest( 16, 10.75 )
  119.  
  120. ftest( 3, 1.fdiv(3) )
  121. ftest( 6, 1.fdiv(3) )
  122. ftest( 9, 1.fdiv(3) )
  123. ftest( 63, 1.fdiv(3) )
  124.  
Success #stdin #stdout 0.02s 6336KB
stdin
Standard input is empty
stdout
              123456 :  2 :    11110001001000000 :               123456
              123456 : 10 :               123456 :               123456
              123456 : 16 :                1E240 :               123456
              123456 : 64 :                  U90 :               123456
             -123456 : 10 :              -123456 :              -123456
             -123456 :  2 :   -11110001001000000 :              -123456
                   0 :  2 :                    0 :                    0
                 2.5 :  2 :                 10.1 :                  2.5
                 0.5 :  2 :                  0.1 :                  0.5
                0.25 :  2 :                 0.01 :                 0.25
               0.125 :  2 :                0.001 :                0.125
              -0.125 :  2 :               -0.001 :               -0.125
                0.75 :  2 :                 0.11 :                 0.75
          1.41421356 :  2 : 1.01101010000010011110011001 :    1.414213553071022 : 6.9e-09
           3.1415926 :  2 : 11.001001000011111101101001101 :    3.141592599451542 : 5.5e-10
           3.1415926 :  3 :    10.01021101222201 :    3.141592596565021 : 3.4e-09
           3.1415926 : 10 :            3.1415926 :            3.1415926
           3.1415926 : 16 :            3.243F69A :    3.141592599451542 : 5.5e-10
           3.1415926 : 64 :              3.93zfe :    3.141592599451542 : 5.5e-10
               10.75 : 16 :                  A.C :                10.75
  0.3333333333333333 :  3 :                  0.1 :   0.3333333333333333
  0.3333333333333333 :  6 :                  0.2 :   0.3333333333333333
  0.3333333333333333 :  9 :                  0.3 :   0.3333333333333333
  0.3333333333333333 : 63 :                  0.L :   0.3333333333333333