为什么0返回此ruby基本转换方法

时间:2013-09-02 15:01:57

标签: ruby math

作为ruby挑战的一部分,我正在制作一个自定义方法num_to_s(num,base),它接受一个数字和基数,并返回一个带有新基数的字符串。

这个问题给了我一个提示,你可以通过这个操作找到每个数字的值 -

(123 / 10**0) % 10 == 3 # ones place
(123 / 10**1) % 10 == 2 # tens place
(123 / 10**2) % 10 == 1 # hundreds place

所以,我创建了以下函数 -

def num_to_s(num, base) 
    values =  ["0", "1", "2","3","4","5","6","7","8","9","a","b","c","d","e","f"]

    answer_array = []

    highest_power = 0 

    #find the highest power
    while base**highest_power <= num
        highest_power+=1
    end

    current_power = 0 
    #run a loop to find the values for base**0 to the highest power
    while current_power <= highest_power
        digit = values[ ((num / base**current_power) % base) ]

        answer_array << digit
        current_power +=1
    end
    answer_array.reverse.join


end

num_to_s(4,2)
num_to_s(20,16)

当我运行此功能时,一切都很有效,除非有时答案的前缀为0.如果我要删除0,答案是正确的。

出于好奇,为什么0出现在方法中?

示例 -

num_to_s(5,2) #=> 0101

虽然实际答案是101

2 个答案:

答案 0 :(得分:2)

while current_power <= highest_power
这是问题所在。你寻找高于num的基数的第一个幂,这意味着你不必考虑这样的权力:在你的例子中,highest_power是3,这意味着,如果你允许current_power等于它,你得到4次迭代{0,1,2,3},而你只需要3,即{0,1,2}。

将其替换为

while current_power < highest_power

你应该没事。奇怪的是你说“有时候”得到0,而理论上你应该每次都得到它。

答案 1 :(得分:1)

您可能对此解决方案感兴趣。它使用常量数组Symbols来避免每次调用方法时重新分配数组values。它还使用Numeric#divmod,它在一次操作中返回商和除法的余数。

Symbols =  ('0' .. '9').to_a + ('a' .. 'z').to_a

def num_to_s(num, base)

  ret = ''

  while num > 0 or ret == ''
    num, digit = num.divmod(base)
    ret = Symbols[digit] + ret
  end

  ret

end

puts num_to_s(4, 2)
puts num_to_s(20, 16)
puts num_to_s(255, 8)
puts num_to_s(44_027, 36)

<强>输出

100
14
377
xyz