首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

C++ 實作羅馬數字與阿拉伯數字雙向轉換完整指南

     編輯:C++ 入門

問題描述

給定一個羅馬數字(範圍 1~3999),將其轉換為阿拉伯數字;反之亦然。羅馬數字符號及對應值如下:

符號IVXLCDM
值1510501005001000

羅馬數字規則速覽

  1. 相加規則:相同符號連寫,值相加(如 III = 3)。
  2. 減法規則:小值符號置於大值符號前,表示大值減小值(如 IV = 4, IX = 9)。
  3. 限制規則:I、X、C 連用不超過三個;V、L、D 不可作為減法前綴;特定減法組合固定(IV, IX, XL, XC, CD, CM)。

演算法分析與實作

一、羅馬數字 → 阿拉伯數字

核心邏輯:從左至右掃描,若當前字元值 大於等於 下一字元值,則 相加;若 小於 下一字元值,則 相減(實際上為:加上下一字元值,並扣除兩倍當前字元值)。

範例追蹤

  • XVIII → 10, 5, 1, 1, 1 → 全遞減/相等 → 總和 = 18
  • XIX → 10, 1, 10 → 1 < 10 觸發減法:10 + 1 + 10 - 2×1 = 19

C++ 實作

unsigned int roman2integer(const string& str) {
    if (str.empty()) return 0;
    static const unordered_map<char, int> m = {
        {'I',1}, {'V',5}, {'X',10}, {'L',50},
        {'C',100}, {'D',500}, {'M',1000}
    };
    int sum = m.at(str[0]);
    for (size_t i = 0; i + 1 < str.size(); ++i) {
        if (m.at(str[i]) >= m.at(str[i+1]))
            sum += m.at(str[i+1]);
        else
            sum += m.at(str[i+1]) - 2 * m.at(str[i]);
    }
    return sum;
}

二、阿拉伯數字 → 羅馬數字

核心策略:將所有「減法組合」視為基本符號,建立 值-符號對應表,按值從大到小貪婪匹配。

對應表

值:    1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1
符號:  "M", "CM","D", "CD","C", "XC","L","XL","X","IX","V","IV","I"

C++ 實作

string integer2roman(unsigned int n) {
    if (n < 1 || n > 3999) return "";
    static const unsigned int val[] = {1000,900,500,400,100,90,50,40,10,9,5,4,1};
    static const string sym[]     = {"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
    string res;
    for (size_t i = 0; i < sizeof(val)/sizeof(val[0]); ++i) {
        while (n >= val[i]) {
            res += sym[i];
            n -= val[i];
        }
    }
    return res;
}

驗證測試策略

雙向轉換測試:對 1~3999 每個整數 n,計算 r = integer2roman(n),再計算 m = roman2integer(r),斷言 n == m。若全通過,證明實作正確。

void test_case(int n) {
    for (int i = 1; i <= n; ++i) {
        string roman = integer2roman(i);
        int integer = roman2integer(roman);
        assert(i == integer);
    }
}

完整程式碼結構

程式包含兩個核心函式 roman2integer、integer2roman、測試函式 test_case 及 main 入口。編譯執行後無輸出即代表所有測試通過。

參考資源

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved