RO2INT - Đổi số La Mã

Xem dạng PDF

Gửi bài giải

Điểm: 1,00 (OI)
Giới hạn thời gian: 1.0s
Giới hạn bộ nhớ: 256M
Input: stdin
Output: stdout

Người đăng:
Dạng bài
Ngôn ngữ cho phép
C, C#, C++, Go, Java, JavaScript, Kotlin, Pascal, Perl, PHP, Python, Ruby, Rust, Scratch, Swift

Đề bài

Cho một chuỗi số La Mã hợp lệ, hãy đổi về dạng số thập phân của nó.

Được biết các ký hiệu trong số La Mã như sau:

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

Trong đó sẽ có một số trường hợp đặc biệt:

  • IV: 4
  • IX: 9
  • XL: 40
  • XC: 90
  • CD: 400
  • CM: 900

Mẫu input & output

  • Input: Gồm một chuỗi số La Mã hợp lệ.
XIII
  • Output: Dạng số thập phân của chuỗi đã cho.
13

Bình luận

Hãy đọc nội quy trước khi bình luận.



  • 0
    mduyiuems1tg  đã bình luận lúc 15, Tháng 4, 2025, 7:11

    include<bits/stdc++.h>

    #define ll long long
    #define DOWNTIME ios_base::sync_with_stdio(false);cin.tie(NULL); cout.tie(NULL); 
    
    using namespace std;
    
    const int mx = 1e6 + 1; 
    
    int getval(char x) {
        if (x == 'I') return 1;
        if (x == 'V') return 5;
        if (x == 'X') return 10;
        if (x == 'L') return 50;
        if (x == 'C') return 100;
        if (x == 'D') return 500;
        if (x == 'M') return 1000;
        return 0;
    }
    
    int main(){
       //freopen("input.txt","r", stdin);
       //freopen("output.txt", "w", stdout);
        DOWNTIME
        string s; cin >> s;
        int check[(int) s.size()];
        ll sum = 0;
        memset(check, 0, sizeof(check));
    
        for (int i = 0; i < s.size() - 1; i++) {
            if (getval(s[i]) < getval(s[i + 1])) {
                sum += (getval(s[i + 1]) - getval(s[i])); 
                check[i + 1] = 1;
            }
            else if (!check[i]) {
                sum += getval(s[i]);
                check[i] = 1;
            }
        }
        if(!check[s.size() - 1]) sum += getval(s[s.size() - 1]);
    
       cout << sum;
        return 0;
    }