题解与讨论区 1156: 张老师数数

题解与讨论区 1156: 张老师数数

[命题人 : ]
时间限制 : 1.000 sec  内存限制 : 256 MB

返回问题页面

题目描述

    张老师需要用数字来统计学生们的得分情况,但阿拉伯数字已经不能满足他的要求了,所以想请你帮忙将学生的成绩转换成罗马数字。
    罗马数字是由七个不同的符号来表示(I,V,X,L,C,D和M),其中每个符号对应的值如下表
    符号 值
    I   1
    V   5
    X   10
    L   50
    C   100
    D   500
    M   1000
    罗马数字通常从左到右从最大写到最小,表示他们的总和。但是,数字4的罗马数字表示不是IIII,而是IV,表示5-1=4。同样的,有6个应用相同原理的规则:
    I可以放在V(5)和X(10)之前代表4和9。 
    X可以在L(50)和C(100)之前代表40和90。 
    C可以放在D(500)和M(1000)之前代表400和900。
    现在给定一个整数,张老师请你计算出其罗马数字的表示。

第1156题的题解

重型榴弹手

Newbie 的题解


签到题,可按位预处理出对应罗马数字,注意 4 和 9.

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. constexpr int MAXN = 2e3 + 3, MOD = 1e9 + 7;
  4. array<string, MAXN> rome;
  5. int main() {
  6. rome[1] = "I", rome[2] = "II", rome[3] = "III", rome[4] = "IV", rome[5] = "V";
  7. rome[6] = "VI", rome[7] = "VII", rome[8] = "VIII", rome[9] = "IX";
  8. rome[10] = "X", rome[20] = "XX", rome[30] = "XXX", rome[40] = "XL", rome[50] = "L";
  9. rome[60] = "LX", rome[70] = "LXX", rome[80] = "LXXX", rome[90] = "XC";
  10. rome[100] = "C", rome[200] = "CC", rome[300] = "CCC", rome[400] = "CD", rome[500] = "D";
  11. rome[600] = "DC", rome[700] = "DCC", rome[800] = "DCCC", rome[900] = "CM";
  12. rome[1000] = "M", rome[2000] = "MM";
  13. string s, ans;
  14. cin >> s;
  15. int mul = pow(10, s.size() - 1);
  16. for (auto& c : s) {
  17. ans += rome[(c - '0') * mul];
  18. mul /= 10;
  19. }
  20. cout << ans << endl;
  21. return 0;
  22. }



点赞 0
举报