0

作为 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

4

2 回答 2

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,而理论上你应该每次都得到它。

于 2013-09-02T15:07:02.090 回答
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
于 2013-09-02T23:00:59.713 回答