C言語で整数をローマ数字に変換する方法
はじめに
本記事では、C言語を用いて10進数の整数をローマ数字に変換するプログラムの作成方法を解説します。対象となる数値nは、1以上4000以下の範囲を想定しています。
ローマ数字の一覧
まず、基本となるローマ数字とその対応する数値を確認しておきましょう。
| 数値 | ローマ数字 |
|---|---|
| 1 | I |
| 4 | IV |
| 5 | V |
| 9 | IX |
| 10 | X |
| 40 | XL |
| 50 | L |
| 90 | XC |
| 100 | C |
| 400 | CD |
| 500 | D |
| 900 | CM |
| 1000 | M |
| 4000 | MMMM |
例えば、n = 859 の場合、そのローマ数字表現は DCCCLIX となります。
変換アルゴリズムの考え方
この問題は、「貪欲法(グリーディ法)」と呼ばれる手法と再帰処理を組み合わせることで効率的に解くことができます。具体的な手順は以下の通りです。
- ローマ数字の記号と対応する数値を格納した配列(nume配列)を定義します。
- 再帰的なアプローチを採用し、nume配列と変換対象の数値numを受け取る関数 decToRoman() を使用します。
- decToRoman() の内部処理は以下のようになります。
- num が 0 でない場合:
- max := nume配列の中から、num を超えない最大の値を持つ要素を検索します。
- その max に対応する記号を結果の文字列に追加(出力)します。
- num := num − max の値として、残りの数値を更新します。
- decToRoman(nume, num) を再帰的に呼び出します。
C言語での実装例
それでは、実際のコード実装を見ていきましょう。
#include<stdio.h>
typedef struct{
char *sym;
int val;
}numeral;
int maxNume(numeral *nu, int num){
int i, index;
for(i = 0; i<15; i++){// 配列内には15個のローマ数字が存在
if(nu[i].val <= num)
index = i;
}
// 数値を超えない最大値を持つローマ数字のインデックスを返す
return index;
}
void decToRoman(numeral *nu, int num){
int max;
if(num != 0){
max = maxNume(nu, num);
printf("%s", nu[max].sym);
num -= nu[max].val;// 残りの数値を減算
decToRoman(nu, num);// 再帰的にローマ数字を出力
}
}
main(){
int number;
numeral nume[15] = {{"I",1},{"IV",4},{"V",5},{"IX",9}, {"X",10},{"XL",40},{"L",50},{"XC",90},
{"C",100},{"CD",400},{"D",500},{"CM",900},{"M",1000},{"MMMM",4000},{"V'",5000}};
printf("Enter a decimal number: ");
scanf("%d", &number);
if(number >0 && number <= 5000){// 入力値の妥当性チェック
printf("The Roman equivalent of %d is ", number);
decToRoman(nume, number);
}
else{
printf("Invalid Input");
}
printf("\n");
}
コードのポイント
このプログラムでは、構造体 numeral を使ってローマ数字の記号(sym)とその数値(val)をペアで管理しています。maxNume() 関数は、与えられた数値を超えない最大のローマ数字のインデックスを返し、decToRoman() 関数がその結果を再帰的に適用することで変換を実現しています。また、入力値が正の範囲内であるかどうかのチェックも行っており、範囲外の値が入力された場合はエラーメッセージを表示します。
実行例
入力
570
3574
出力
DLXX
MMMDLXXIV
このように、570 は DLXX、3574 は MMMDLXXIV と正しく変換されていることが確認できます。
-
Pythonで整数の桁を逆順に反転する方法を解説
問題の概要 32ビット符号付き整数が与えられ、その各桁を逆順に並べ替えることを考えます。たとえば、入力が425であれば出力は524となります。また、整数は符号を持つため、負の数にも対応する必要があります。入力が-425の場合は、-524が出力されます。 前提条件と制約 この問題では、扱う値は32ビット符号付き整数の範囲、すなわち-2147483648 ~ 2147483647(-231 ~ 231-1)に収まるものとします。もし反転後の結果がこの範囲を超えてオーバーフローする場合は、関数は0を返します。 解き方のアプローチ この問題はPythonを使うと非常にシンプルに解けます。基本的な流
-
正の整数のビットを反転するPythonプログラムの書き方
Pythonで正の整数のビット順を逆にするには、まず bin() 関数を使って数値を2進数に変換します。bin() は変換結果の先頭に「0b」というプレフィックスを付加するため、その最初の2文字を除外し、残りの部分を反転させます。さらに、指定されたビットサイズに合わせて、反転した文字列の末尾に0を補完します。最後に、反転した2進数の文字列を整数へと変換し直すことで、ビットが反転された値が得られます。 アルゴリズム integernumber(n, bit_size) /* n は対象の数値、bit_size はビットサイズ */ ステップ1: まず bin() 関数で数値を2進数に変換する。