#42084: c++


11110109@gm.chihlee.edu.tw (陳昇錩)

學校 : 不指定學校
編號 : 286639
來源 : [140.131.84.201]
最後登入時間 :
2024-09-27 16:53:53
a013. 羅馬數字 -- NPSC 模擬試題 | From: [122.99.29.35] | 發表日期 : 2024-09-25 15:07

#include <iostream>
#include <map>
#include <cmath>
using namespace std;

// 函數:將羅馬數字轉換為阿拉伯數字
int rm2int(string s)
{
    // 建立一個 map,將羅馬數字字符映射到對應的阿拉伯數字
    map<char, int> rm = {
        {'I', 1}, {'V', 5}, {'X', 10}, {'L', 50}, 
        {'C', 100}, {'D', 500}, {'M', 1000}
    };

    int result = 0;  // 初始化結果變數,用來儲存最終的阿拉伯數字
    // 遍歷輸入的羅馬數字字串
    for (int i = 0; i < s.size(); i++)
    {
        // 如果當前字符的值比下一個字符小,進行減法(特殊規則,如 IV 表示 4)
        if (i + 1 < s.size() && rm[s[i]] < rm[s[i + 1]]) {
            result -= rm[s[i]];  // 減去當前字符的值
        }
        // 否則進行加法
        else {
            result += rm[s[i]];  // 加上當前字符的值
        }
    }
    return result;  // 返回最終的阿拉伯數字
}

// 函數:將阿拉伯數字轉換為羅馬數字
string int2rm(int num) {
    // 建立一個 pair 陣列,將阿拉伯數字和羅馬數字配對
    pair<int, string> rm[] = {
        {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"}
    };

    string result = "";  // 初始化結果字串
    // 從最大的數字開始,逐一匹配
    for (int i = 0; i < 13; i++)
    {
        // 只要當前數字大於等於 rm[i].first,就減去對應的阿拉伯數字,並將羅馬數字加到結果中
        while (num >= rm[i].first) {
            result += rm[i].second;  // 加上對應的羅馬數字
            num -= rm[i].first;  // 減去對應的阿拉伯數字
        }
    }
    return result;  // 返回最終的羅馬數字
}

int main()
{
    string num1, num2;
    // 持續讀取輸入直到輸入包含 #
    while (cin >> num1 >> num2 && num1 != "#" && num2 != "#") {
        // 將兩個羅馬數字轉換為阿拉伯數字
        int v1 = rm2int(num1);
        int v2 = rm2int(num2);

        // 計算兩個數字的絕對差值
        int diff = abs(v1 - v2);

        // 如果差值為 0,輸出 "ZERO"
        if (diff == 0)
        {
            cout << "ZERO" << endl;
        }
        else
        {
            cout << int2rm(diff) << endl;
        }
    }

    return 0;
}

 
ZeroJudge Forum