2

昨日、Chris Pine の本「Learn to Program」の演習 (9.5) を完了しました。これは整数から古い学校のローマ数字へのコンバーターです。

これが私がやった方法です:

def old_roman_numeral number
    roman_number = ""
    while number != 0
        if number % 1000 == 0
            number -= 1000
            roman_number += "M"
            next
        elsif number % 500 == 0
            number -= 500
            roman_number += "D"
            next
        elsif number % 100 == 0
            number -= 100
            roman_number += "C"
            next
        elsif number % 50 == 0
            number -= 50
            roman_number += "L"
            next
        elsif number % 10 == 0
            number -= 10
            roman_number += "X"
            next
        elsif number % 5 == 0
            number -= 5
            roman_number += "V"
            next
        else
            number -= 1
            roman_number += "I"
        end
    end
    roman_number.reverse
end

puts "Please enter any number and I convert it to"
puts "Old-school Roman numerals."
puts
num = gets.chomp.to_i
puts "Your number #{num} converted to Old-school Roman is:"
puts (old_roman_numeral num)

スクリプトを実行すると、正しいローマ数字が出力されます。

たとえば、1200 => MCC

でも、今日目が覚めたとき、最初に思ったのは、これは正しくない! 1200 % 1000 の余りは 200 であり、0 ではありません! しかし、なぜ出力MCCであり、CCCCCCCCCCCCではないのですか???

4

3 に答える 3

7

プログラムをトレースすると、実際には% 100 == 0最初に 2 回一致し、 を取得CCし、1000 を残します。次に、 に一致し% 1000 == 0、 を残しCCMます。最後に、文字列を逆にして、MCC.


補足コメント: おそらく、「減算」部分 (または)>=の特殊なケースを使用して、文字列を順方向に構築する一連の比較を使用したため、問題に対する興味深いアプローチです。2 回目の読み取りでは、このソリューションは出力ではなくであるように見えるため、特殊なケースは意味がありません。IVIXIIIIIV

于 2013-07-01T08:10:12.963 に答える
0

コードは逆の順序で数字を計算します。すなわち

最初にを取得しC、次に別のCを取得し、ループの 3 回目の反復で を取得しMます。

最後に、このコード行:

roman_number.reverse

CCMにするMCCと、実際に得られる結果が得られます。

何が起こるかをよりよく理解するために、次のようにコードを変更できます。

    if number % 1000 == 0
        number -= 1000
        roman_number += "M"
        next

になります:

    if number % 1000 == 0
        number -= 1000
        roman_number += "M"
        puts "number " + number.to_s
        puts "roman_number " + roman_number
        next

すべての if ブロックに対してこれを行います。そうすれば、各ステップで何が起こるかがわかります。

于 2013-07-01T08:20:50.587 に答える