こんにちは、Habrauser。
主にJ2MEプラットフォーム用に開発していたので、私は常に自分のプロジェクトに熱意を注いできました。 そのため、一度、メニュー項目を選択する必要がありました。
ダッシュや番号を付けて標準ソリューションを使用したくありませんでしたが、他のオプションはありませんでした。 これらのポイントをどのように配置するのが最善かを考えて、ローマ数字を使用してポイントに番号が付けられた古い学校史ノートに偶然出くわしました。 ビンゴ!
当時のローマ数字の知識は、2ダースまたは3ダースに数えるのに十分だったことを認めなければなりません。 アイテムの番号付けのための何かで十分だったはずです。 しかし、他のプログラマーと同様に、アラビア語の整数10進数をローマ数字に変換できる既製のソリューションが必要でした。
ウィキペディアでローマのSSについて説明した記事が見つかり、すぐにアラビア語からローマ数字に翻訳するためのアルゴリズムをスケッチしました。
基本的な番号:
I-1
V-5
X-10
L-50
C-100
D-500
M-1000
ゼロはまったくないため、空の値を使用します。
したがって、アルゴリズム自体は非常に単純です。
1.千単位の数を選択します(ある場合)。 結果の値により、n個の「M」(読み取り、n * 1000)の文字列を生成できます。
例:2012年の最初の段落の後に「MM」が表示されます
2. 1000で割った後の残りを取得して、将来の次の値を強調表示します。
3.(可能な場合)500を選択します。この場合、取得された値が4(5 + 4 = 9)である場合、値は1000-100として書き込まれる必要があることを考慮します。
例:このポイントの後の1887は「MD」を与えます。
1945年それぞれ「MCM」。
4. 500で割った余りを取得します。
5. 100で除算して数百もの数を割り当て、前の結果に追加します。 400に相当する4を取得した場合、500〜100、つまり「CD」と書き込みます。
例:1709は、このステップの後にMDCCCを提供します。
6. 100による除算の残りを取得します。
7.それから全体で50を割り当てます。 値が4(90)に等しい場合は、100-10として書き込みます。これは「XC」に等しくなります。 それ以外の場合は、文字列「L」に追加します
例:1986は、結局「MCML」を与えます。
8.残りの50を選択します。
9. 10の整数を選択し、記号「X」を文字列にn回追加します。 同時に、40は50-10、つまり「XL」と書かれていることを考慮します。
例:1986は結局「MCMLXXX」を与えます。
10. 10で割ることで剰余を取得します。このステップは、剰余をすぐに同等のものと同等にすることができるという点で他と異なります。 1 = I、7 = VIIなど。
このアルゴリズムで数値を列挙すると、次のような結果が得られます。
2012 == MMXII
以下は、アルゴリズムを実装するJavaソースコードです。
public class RoManiac {