LoginSignup
5
0

More than 3 years have passed since last update.

roman numerals

Last updated at Posted at 2020-12-18

お題

アラビア数字(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 のコーディング能力がないので, 上記のコードはまだまだ改善の余地はあると考える

参考ページ

  1. YOU-GO9さんの "Roman_numerals"

  • source ~/grad_members_20f/members/djj31370/c7_roman_numerals.org
5
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
0