お題
アラビア数字(arabic numerals)を受け取って,ローマ数字(roman numerals)を返すmethodを書く.
ローマ数字で使われる文字
arabic numerals | roman numerals |
---|---|
1 | I |
5 | V |
10 | X |
50 | L |
100 | C |
500 | D |
1000 | M |
テスト
arabic numerals | roman numerals |
---|---|
1 | I |
2 | II |
4 | IV |
5 | V |
6 | VI |
9 | IX |
10 | X |
11 | XI |
14 | XIV |
15 | XV |
19 | XIX |
38 | XXXVIII |
42 | XLII |
49 | XLIX |
51 | LI |
97 | XCVII |
99 | XCIX |
439 | CDXXXIX |
483 | CDLXXXIII |
499 | CDXCIX |
732 | DCCXXXII |
961 | CMLXI |
999 | CMXCIX |
1000 | M |
3999 | MMMCMXCIX |
方針
- 千の位の数を調べる.
- M を(千の位の数)個並べる
- 百の位の数を調べる.
- 5 以上で 9 なら CM をそれ以外なら D と C を(百の位の数 - 5)個並べる
- 5 以下で 4 なら CD をそれ以外なら C を(百の位の数)個並べる
- 十の位の数を調べる
- 5 以上で 9 なら XC をそれ以外なら L と X を(十の位の数 - 5)個並べる
- 5 以下で 4 なら XL をそれ以外なら X を(十の位の数)個並べる
- 一の位の数を調べる
- 5 以上で 9 なら IX をそれ以外なら V と I を(一の位の数 - 5)個並べる
- 5 以下で 4 なら IV をそれ以外なら I を(一の位の数)個並べる
code
(*) このコードは4000未満の数字をローマ数字に変換するものである.
def roman_numerals (number)
# 1000 の個数を計算
thousand = number / 1000
a = number % 1000
roman = 'M' * thousand
# 100 の個数を計算
hundred = a / 100
b = a % 100
if (hundred == 9)
roman += 'CM';
elsif (hundred >= 5)
roman += 'D' + 'C' * (hundred - 5)
elsif (hundred == 4)
roman += 'CD'
else
roman += 'C' * hundred
end
# 10 の個数を計算
ten = b / 10
c = b % 10
if (ten == 9)
roman += 'XC'
elsif (ten >= 5)
roman += 'L' + 'X' * (ten - 5)
elsif (ten == 4)
roman += 'XL'
else
roman += 'X' * ten
end
# 1 の個数を計算
if (c == 9)
roman += 'IX'
elsif (c >= 5)
roman += 'V' + 'I' * (c - 5)
elsif (c == 4)
roman += 'IV'
else
roman += 'I' * c
end
return roman
end
[1, 2, 4, 5, 6, 9, 10, 11, 14, 15, 19, 38, 42, 49, 51, 97, 99, 439, 483, 499, 732, 961, 999, 1000, 3999].each do |number|
puts "#{number}, #{roman_numerals(number)}"
end
実行結果は
1, I
2, II
4, IV
5, V
6, VI
9, IX
10, X
11, XI
14, XIV
15, XV
19, XIX
38, XXXVIII
42, XLII
49, XLIX
51, LI
97, XCVII
99, XCIX
439, CDXXXIX
483, CDLXXXIII
499, CDXCIX
732, DCCXXXII
961, CMLXI
999, CMXCIX
1000, M
3999, MMMCMXCIX
上記のテストと一致することを確認した.
私は ruby のコーディング能力がないので, 上記のコードはまだまだ改善の余地はあると考える
参考ページ
- source ~/grad_members_20f/members/djj31370/c7_roman_numerals.org