Почему мой код преобразования римских чисел (например, mcmxcix) в действительные числа не работает? - PullRequest
0 голосов
/ 12 января 2011

Я хочу преобразовать римские цифры, такие как "mcmxcix", в арабские целые числа, такие как "1999".

Мой код выглядит так:

#~ 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
  end

  num
end    

puts(roman_to_integer('MCMXCIX'))

Вывод равен 0, ноЯ не понимаю, почему?

Ответы [ 3 ]

2 голосов
/ 12 января 2011

Ruby не имеет оператора постинкремента.Когда он видит ++, он интерпретирует это как один инфикс +, за которым следует один префикс (унарный) +.Поскольку он ожидает, что после этого последует операнд, но вместо этого находит ключевое слово end, вы получаете синтаксическую ошибку.

Вам необходимо заменить x++ на x += 1.

Более тогообратите внимание, что x на самом деле не входит в область действия метода roman_to_integer (что не является синтаксической ошибкой, но, тем не менее, ошибочным).

Кроме того, вам придется заменить все ваши if s.кроме первого с elsif с.То, как вы написали это, все if являются вложенными, что означает, что a) вам не хватает end s и b) код не имеет нужной вам семантики.

1 голос
/ 12 января 2011

arr продолжает уничтожаться в вашем цикле while, и он не находится в области действия вне цикла. Переместите следующую строку над оператором while:

arr = Array.new
1 голос
/ 12 января 2011

Вам не хватает закрывающих скобок, поэтому

puts(roman_to_integer('mcmxcix')

должно быть

puts roman_to_integer('mcmxcix')

или

puts(roman_to_integer('mcmxcix'))
...