0

「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ですが、理由がわかりません。

4

3 に答える 3

2

Rubyにはポストインクリメント演算子がありません。それを見ると、それを1つの中置とそれに続く1つの接頭辞(単項)++として解釈します。その後にオペランドが続くことを期待しますが、代わりにキーワードを見つけるため、構文エラーが発生します。++end

に置き換える必要がありx++ますx += 1

xさらに、これは実際にはメソッド内のスコープに含まれていないことに注意してくださいroman_to_integer(これは構文エラーではありませんが、それでも間違っています)。

ifさらに、最初のものを除くすべてのをsに置き換える必要がありますelsif。すべてのifsを記述した方法はネストされています。つまり、a)十分なendsがなく、b)コードに必要なセマンティクスがありません。

于 2011-01-12T16:34:26.207 に答える
1

閉じ括弧がないので

puts(roman_to_integer('mcmxcix')

する必要があります

puts roman_to_integer('mcmxcix')

また

puts(roman_to_integer('mcmxcix'))
于 2011-01-12T16:36:12.653 に答える
1

arrはwhileループで消滅し続け、ループ外のスコープにはありません。次の行をwhileステートメントの上に移動します。

arr = Array.new
于 2011-01-12T19:12:39.623 に答える