罗马数字计算器

时间:2015-05-11 07:01:19

标签: arrays ruby hash roman-numerals

我必须做出一项任务,其中我必须实施罗马数字以及对其进行计算时遵循的规则,包含在此链接中

http://www.periodni.com/roman_numerals_converter.html

我不想要代码,只是帮助。到目前为止,我已经采用了两种方法:

  1. 使用常量,我已经将罗马数字声明为常量,然后在获得输入后,我可以选择解码字符串输入,后来我放弃了。
  2. 使用哈希。我已经用数字声明了一个哈希值,然后在获得输入后,我使用to_sym方法将字符串转换为相应的值。在此之后,我采用了一个包含罗马数字小数的数组,我打算将它们与输入进行比较。 我被困在这一部分。我不知道如何比较这里。另外,我不想对输入数组进行排序,因为那时计算会出错。
  3. 任何人都可以帮我解决这个问题吗?不是代码,只是步骤。

    这是我到目前为止所做的:

    class Conversion
      hash ={ :I => 1, :V => 5, :X => 10, :L => 50, :C => 100, :D => 500, :M => 1000}
      result = 0
      value = []
      hash_values = hash.values
    
      puts "enter input string"
      input = gets.chomp.upcase.split(//)
    
      input.each do |i|
        value <<  hash[i.to_sym]
      end
    
      for i in value do
        if value[i] > value[i+1]
          result = result + value[i]
        else
          result = result + (value[i+1] - value[i])
        end
      end
    
      puts result
    end
    

    如果您运行代码,您会看到当我尝试在最后一个循环中进行比较时,它会将索引用于计算。当我尝试使用两个哈希时也是如此。我不能使用任何gem或外部库,因为这是必需的。

1 个答案:

答案 0 :(得分:1)

我们的想法是创建一个树,每个节点都有两个子节点:左边是减去的,右边是要添加的内容。

获得字符串后,您会找到最有价值的字母并将其设为第一个节点:

  XLIX

    L
   / \
  X   IX

然后在子节点上递归运行此函数,直到节点变得微不足道(如XXIII)。

最后一步是递归计算结果。