开发者

Why doesn't my conversion code for roman numbers ('mcmxcix' for e.g) to real numbers work?

I want to convert Roman numerals, such as "mcmxcix", to arabic integers like "1999".

My code looks like:

#~ I = 1 V = 5 X = 10 L = 50
#~ C = 100 D = 500 M = 1000


def roman_to_integer roman
  len = roman.length
  x = 1
  while x <= len
    arr = Array.new
    arr.push roman[x]
    x += 1
  end
  num = 0
  arr.each do |i|
    if i == 'I'
      num +=  1
    elsif i == 'V'
      num +=  5
    elsif i == 'X'
      num +=  10
    elsif i == 'L'
      num +=  50
    elsif i == 'C'
      num +=  100
    elsif i == 'D'
      num += 500
    elsif i == 'M'
      num +=  1000
    end
  e开发者_如何学Cnd

  num
end    

puts(roman_to_integer('MCMXCIX'))

The output is 0, but I don't understand why?


Ruby doesn't have a post-increment operator. When it sees ++ it interprets that as one infix + followed by one prefix (unary) +. Since it expects an operand to follow after that, but instead finds the keyword end, you get a syntax error.

You need to replace x++ with x += 1.

Furthermore note that x isn't actually in scope inside the roman_to_integer method (which isn't a syntax error, but nevertheless wrong).

Additionally you'll have to replace all your ifs except the first with elsifs. The way you wrote it all the ifs are nested, which means that a) you don't have enough ends and b) the code doesn't have the semantics you want.


You are missing a closing parentheses so

puts(roman_to_integer('mcmxcix')

should be

puts roman_to_integer('mcmxcix')

or

puts(roman_to_integer('mcmxcix'))


The arr keeps getting annihilated in your while loop, and it is not in the scope outside of the loop. Move the following line above the while statement:

arr = Array.new
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜