Programming

C++高速ローマ数字変換

Spread the love

この記事では、C++によるローマ数字変換器の作成について探求します。10進数をローマ数字に変換することに焦点を当て、変換プロセスを詳しく調べます。効率的で正確なコードを開発するには、基礎となるロジックを明確に理解することが不可欠です。

目次

10進数をローマ数字に変換する

ローマ数字システムは、数字を表すために文字の組み合わせを使用します。各文字には特定の数値が割り当てられています。

  • I = 1
  • V = 5
  • X = 10
  • L = 50
  • C = 100
  • D = 500
  • M = 1000

変換には、これらの値を反復処理し、数字の位置と隣接する値に基づいて戦略的に加算または減算することが含まれます。たとえば、IV(4)はV(5) – I(1)、IX(9)はX(10) – I(1)です。この減算の原則は、効率的な表現の鍵となります。

C++実装

次のC++関数は、10進数をローマ数字に効率的に変換します。


#include <iostream>
#include <map>
#include <string>

std::string decimalToRoman(int num) {
    if (num <= 0 || num > 3999) return "Invalid Input";

    std::map<int, std::string> romanMap = {
        {1000, "M"}, {900, "CM"}, {500, "D"}, {400, "CD"},
        {100, "C"}, {90, "XC"}, {50, "L"}, {40, "XL"},
        {10, "X"}, {9, "IX"}, {5, "V"}, {4, "IV"}, {1, "I"}
    };

    std::string result = "";
    for (auto const& [value, symbol] : romanMap) {
        while (num >= value) {
            result += symbol;
            num -= value;
        }
    }
    return result;
}

int main() {
    int decimalNum;
    std::cout << "10進数を入力してください (1-3999): ";
    std::cin >> decimalNum;
    std::string romanNum = decimalToRoman(decimalNum);
    std::cout << "ローマ数字は: " << romanNum << std::endl;
    return 0;
}

このコードは、効率的な記号検索のためのマップと、繰り返し記号を処理するためのwhileループを利用しています。減算のケース(4と9など)は、最適なパフォーマンスのためにマップに明示的に定義されています。

エラー処理と効率性

提供されたコードには、1〜3999の範囲外の入力に対する基本的なエラー処理が含まれています。より堅牢なソリューションには、追加のチェックを追加できます。マップの使用は、ローマ数字記号のO(1)の検索時間を提供することにより、効率を大幅に向上させます。反復的なアプローチは、不要な計算を回避します。

結論

この記事では、C++で10進数をローマ数字に変換するための明確で効率的な方法を紹介しました。マップの使用は、可読性とパフォーマンスの両方を向上させます。このアプローチは、より大きな数値を処理したり、より複雑なアプリケーションに統合したりするのに簡単に適応できます。本番環境向けのソリューションには、常に徹底的なエラー処理を忘れないでください。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です