【备战秋招】每日一题:华东师范大学保研机试-2022-罗马数字

为了更好的阅读体检,可以查看我的算法学习博客罗马数字

题目内容

罗马数字是古罗马使用的记数系统,现今仍很常见。

罗马数字有七个基本符号: I,V,X,L,C,D,M。

罗马数字IVXLCDM
对应的阿拉伯数字1510501005001000

需要注意的是罗马数字与十进位数字的意义不同,它没有表示零的数字,与进位制无关。按照下述的规则可以表示任意正整 数。

“标准”形式

重复次数:一个罗马数字重复几次,就表示这个数的几倍。

右加左减:

  • 1.在较大的罗马数字的右边记上较小的罗马数字,表示大数字加小数字。

  • 2.在较大的罗马数字的左边记上较小的罗马数字,表示大数字减小数字。

  • 3.左减的数字有限制,仅限于I,X,C.例如45表示XLV,而不是VL

  • 4.左减时不可跨越一个位值。例如,99是XCIX

  • ([100- 10]+ [10- 1]),而不是IC ([100 - 1])。等同于阿拉伯数字每位数字分别表示。

  • 5.左减数字必须为一位,比如8是VIII,而不用IIX

  • 6.罗马数字V,L,D中的任何一个放在较大的罗马数字右边只能使用一个。

  • 7.右加连续相同数字不超过三位,比如14是XIV,而不是XIIII

现在给出一个阿拉伯数字表示的十进制正整数,输出其对应的罗马数字。

输入格式

一行十进制整数(1 \leq n \leq 1000)

输出格式

一行字符串,表示对应的罗马数字

样例

input

3

output

III

思路

这题最主要的难点就是规则繁杂。最快的理解规则方式是,先把1−101−10 都表示出来!

十进制12345678910
罗马数字IIIIIIIVVVIVIIVIIIIXX

根据条件7,1,2,31,2,3 一定是 I,II,III

对于4,根据条件7,不能是IIII,所以根据条件2得到:IV. 对于9是同理的

I II III IV V VI VII VIII IX X

我们发现这样的规律很容易推广到10,20,...,100 与 100 , 200 , 300 , ... , 1000

十进制102030405060708090100
罗马数字XXXXXXXLLLXLXXLXXXXCC
十进制1002003004005006007008009001000
罗马数字CCCCCCCDDDCDCCDCCCCMM

有上面三张表,我们就可以表示出[1,1000] 内的任何一个数。只需要拆分十进制位即可。

例如:338=300+30+8。所以是CCCXXXVIII

实现

1.存表

2.将读入的数十进制拆分

3.查表输出

代码:

#include<bits/stdc++.h>
using namespace std;
string a[10000];
int main()
{
    a[1] = "I";
    a[2] = "II";
    a[3] = "III";
    a[4] = "IV";
    a[5] = "V";
    a[6] = "VI";
    a[7] = "VII";
    a[8] = "VIII";
    a[9] = "IX";
    a[10] = "X";
    a[20] = "XX";
    a[30] = "XXX";
    a[40] = "XL";
    a[50] = "L";
    a[60] = "LX";
    a[70] = "LXX";
    a[80] = "LXXX";
    a[90] = "XC";
    a[100] = "C";
    a[200] = "CC";
    a[300] = "CCC";
    a[400] = "CD";
    a[500] = "D";
    a[600] = "DC";
    a[700] = "DCC";
    a[800] = "DCCC";
    a[900] = "CM";
    a[1000] = "M";
    int n;
    cin >> n;
    int x = n % 10;
    n -= x;
    int y = n % 100;
    n -= y;
    int z = n;
    cout << a[z] + a[y] + a[x] << endl;
    return 0;
}

思路

这题最主要的难点就是规则繁杂。最快的理解规则方式是,先把1−101−10 都表示出来!

十进制12345678910
罗马数字IIIIIIIVVVIVIIVIIIIXX

根据条件7,1,2,31,2,3 一定是 I,II,III

对于4,根据条件7,不能是IIII,所以根据条件2得到:IV. 对于9是同理的

I II III IV V V I VII VIII IX X

我们发现这样的规律很容易推广到10,20,...,100 与 100 , 200 , 300 , ... , 1000

十进制102030405060708090100
罗马数字XXXXXXXLLLXLXXLXXXXCC
十进制1002003004005006007008009001000
罗马数字CCCCCCCDDDCDCCDCCCCMM

有上面三张表,我们就可以表示出[1,1000] 内的任何一个数。只需要拆分十进制位即可。

例如:338=300+30+8338=300+30+8。所以是

CCCXXXVIII

实现

1.存表

2.将读入的数十进制拆分

3.查表输出

代码:

#include<bits/stdc++.h>
using namespace std;
string a[10000];
int main()
{
    a[1] = "I";
    a[2] = "II";
    a[3] = "III";
    a[4] = "IV";
    a[5] = "V";
    a[6] = "VI";
    a[7] = "VII";
    a[8] = "VIII";
    a[9] = "IX";
    a[10] = "X";
    a[20] = "XX";
    a[30] = "XXX";
    a[40] = "XL";
    a[50] = "L";
    a[60] = "LX";
    a[70] = "LXX";
    a[80] = "LXXX";
    a[90] = "XC";
    a[100] = "C";
    a[200] = "CC";
    a[300] = "CCC";
    a[400] = "CD";
    a[500] = "D";
    a[600] = "DC";
    a[700] = "DCC";
    a[800] = "DCCC";
    a[900] = "CM";
    a[1000] = "M";
    int n;
    cin >> n;
    int x = n % 10;
    n -= x;
    int y = n % 100;
    n -= y;
    int z = n;
    cout << a[z] + a[y] + a[x] << endl;
    return 0;
}

总结

评价

一道简单的模拟题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

塔子哥学算法

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值