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