C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++で1から3999までの10進数をローマ数字に変換する方法

はじめに

このチュートリアルでは、1から3999の範囲にある10進数をローマ数字に変換するC++プログラムについて解説します。

ローマ数字は、I(1)、V(5)、X(10)、L(50)、C(100)、D(500)、M(1000)といった記号の組み合わせで数を表す古代ローマの記数法です。さらに、減算則(IがVやXの直前に置かれる場合は4や9を表すなど)にも対応する必要があります。

本プログラムでは、ランダムな整数が与えられたとき、その数値を対応するローマ数字へ変換することを目標とします。

アルゴリズムの考え方

変換には貪欲法(greedy algorithm)を用います。手順は以下の通りです。

  1. 基本となる数値(1, 4, 5, 9, 10, 40, 50, 90, 100, 400, 500, 900, 1000)と、それに対応するローマ数字の記号("I", "IV", "V", "IX", "X", "XL", "L", "XC", "C", "CD", "D", "CM", "M")を配列として用意します。
  2. 大きい数値から順に、入力された数をその数値で割り、商の回数だけ対応する記号を出力します。
  3. 余りを次の処理対象とし、数が0になるまで繰り返します。

C++コード例

#include <bits/stdc++.h>
using namespace std;
//10進数をローマ数字に変換する関数
int printRoman(int number){
   int num[] = {1,4,5,9,10,40,50,90,100,400,500,900,1000};
   string sym[] =
   {"I","IV","V","IX","X","XL","L","XC","C","CD","D","CM","M"};
   int i=12;
   while(number>0){
      int div = number/num[i];
      number = number%num[i];
      while(div--){
         cout<<sym[i];
      }
      i--;
   }
}
int main(){
   int number = 3949;
   printRoman(number);
   return 0;
}

出力結果

MMMCMXLIX

コードの解説

このプログラムでは、入力値3949に対して以下のように処理が進みます。

  • 1000で割ると商は3 → "MMM" を出力し、残りは949
  • 900で割ると商は1 → "CM" を出力し、残りは49
  • 40で割ると商は1 → "XL" を出力し、残りは9
  • 9で割ると商は1 → "IX" を出力し、残りは0

最終的に「MMMCMXLIX」というローマ数字が出力されます。配列のサイズは固定であるため、このアルゴリズムの計算量はO(1)となり、非常に効率的に動作します。

  1. C++で可変数の引数(可変長引数)を扱う方法

    プログラミングをしていると、引数の個数があらかじめ決まっていない関数、つまり呼び出しのたびに異なる数のパラメータを受け取れる関数が必要になる場面があります。C/C++ではこのような状況に対応する仕組みが用意されており、要件に応じて可変個の引数を受け取る関数を自由に定義できます。以下に、そのような関数の定義例を示します。 int func(int, ... ) { . . . } int main() { func(1, 2, 3); func(1, 2, 3, 4); } 注目すべきは、関数func()の最後の引数が省略記号(ピリオド3つの「...」)になってい

  2. C++のCHAR_BITとは?意味と使い方を解説

    CHAR_BITは、char型が持つビット数を表すマクロです。C++では「limits.h」ヘッダーファイル(C++では<climits>)で宣言されており、一般的な環境では1バイトが8ビットであることを示します。このマクロを利用することで、移植性の高いコードを書くことができます。環境に依存せずにchar型のビット数を取得できるため、ビット演算やデータサイズの計算に役立ちます。CHAR_BITの使用例以下は、C++でCHAR_BITを使用したサンプルコードです。CHAR_BITとsizeofを組み合わせてint型の全ビット数を求め、整数値を2進数形式で出力しています。#includ