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, 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")を配列として用意します。
- 大きい数値から順に、入力された数をその数値で割り、商の回数だけ対応する記号を出力します。
- 余りを次の処理対象とし、数が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)となり、非常に効率的に動作します。
-
C++で可変数の引数(可変長引数)を扱う方法
プログラミングをしていると、引数の個数があらかじめ決まっていない関数、つまり呼び出しのたびに異なる数のパラメータを受け取れる関数が必要になる場面があります。C/C++ではこのような状況に対応する仕組みが用意されており、要件に応じて可変個の引数を受け取る関数を自由に定義できます。以下に、そのような関数の定義例を示します。 int func(int, ... ) { . . . } int main() { func(1, 2, 3); func(1, 2, 3, 4); } 注目すべきは、関数func()の最後の引数が省略記号(ピリオド3つの「...」)になってい
-
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