roman numerals



# お題

アラビア数字(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未満の数字をローマ数字に変換するものである.

```ruby
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"](https://qiita.com/YOU-GO9/items/52dd4d5ea700de657e4c)



------
 - **source** ~/grad_members_20f/members/djj31370/c7_roman_numerals.org