ZJANS

a013. 羅馬數字

Medium Last Update: 2025/05/16
數學

給兩個羅馬數字 a, b
輸出 |a-b|(用羅馬數字表示)


解法一

✅ 完整代碼

評分結果(參考) : AC (1ms, 316KB)

#include<bits/stdc++.h>
#define int long long
using namespace std;

int roman2int(string s){
    int res=0, prev=0, curr=0;
    for(char c : s){
        if(c == 'M')      curr = 1000;
        else if(c == 'D') curr = 500;
        else if(c == 'C') curr = 100;
        else if(c == 'L') curr = 50;
        else if(c == 'X') curr = 10;
        else if(c == 'V') curr = 5;
        else if(c == 'I') curr = 1;

        res += curr;
        if(prev < curr) res -= 2*prev;
        
        prev = curr;
    }

    return res;
}

string int2roman(int num){
    if(num == 0) return "ZERO";
    
    string res = "";
    while(num > 0){
        if(num >= 1000)    { res += "M" ; num -= 1000; } 
        else if(num >= 900){ res += "CM"; num -= 900;  } 
        else if(num >= 500){ res += "D" ; num -= 500;  } 
        else if(num >= 400){ res += "CD"; num -= 400;  } 
        else if(num >= 100){ res += "C" ; num -= 100;  } 
        else if(num >= 90) { res += "XC"; num -= 90;   } 
        else if(num >= 50) { res += "L" ; num -= 50;   } 
        else if(num >= 40) { res += "XL"; num -= 40;   } 
        else if(num >= 10) { res += "X" ; num -= 10;   } 
        else if(num >= 9)  { res += "IX"; num -= 9;    } 
        else if(num >= 5)  { res += "V" ; num -= 5;    } 
        else if(num >= 4)  { res += "IV"; num -= 4;    } 
        else if(num >= 1)  { res += "I" ; num -= 1;    } 
    }

    return res;
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    string a, b;
    while(true){
        cin >> a;
        if(a == "#") break;
        cin >> b;
        cout << int2roman(abs(roman2int(a) - roman2int(b))) << "\n";
    }
    
    return 0;
}