leetcode:Integer to Roman 浅谈古罗马OI生活之数字的研究

leetcode:Integer to Roman 浅谈古罗马OI生活之数字的研究_第1张图片
世界真的很大
算是一道大模拟
模拟题有些时候直接按照题目的要求来写会很麻烦,但是稍微转化思路之后会很简单
模拟题有时候也是有思维含量的,也是要小心注意才是

description:

T组数据,每组数据给出一个正整数,输出其在罗马数字下的表示方法

input:

第一行一个整数T,接下来T行每行一个整数

output:

输出T行,每行一个字符串表示答案


首先什么是罗马数字呢?
就是很多时候能看见的 I,II,III,IX之类的很装逼的东西
简单介绍一下:

相同的数字连写、所表示的数等于这些数字相加得到的数、如:Ⅲ=3;
小的数字在大的数字的右边、所表示的数等于这些数字相加得到的数、 如:Ⅷ=8、Ⅻ=12;
小的数字(限于 I、X 和 C)在大的数字的左边、所表示的数等于大数减小数得到的数、如:Ⅳ=4、Ⅸ=9;
正常使用时、连写的数字重复不得超过三次;
在一个数的上面画一条横线、表示这个数扩大 1000 倍。
(百度百科)

由于我们输出的时候没法加上划线,所以就输出小写就行了


由于题面的限制实在是太多了,当时读的突然是头大,心想这一定是一道非常厉害的大模拟
正在我潜心转研这玩意儿的拼写规则(太多了)时,忽然灵光一现
什么样的人会用这种数字啊?罗马人啊,他们难道每次写数字的时候拼写都这么麻烦吗?
不可能,除非罗马人全是爱因斯坦
那么只是一个普通的罗马人,当他知道了,比如说18这个数的时候,肯定有一个方法快速写出来,就像我们写阿拉伯数字一样
考虑我们在得知18这个数的时候,大脑是怎么得出18这个数字对应的阿拉伯字符的
10进制拆分。
我们大概是把18拆成10和8再在不同的数位上分别来写的
这是由于我们采用的是10进制的结果
罗马人的数字I,V,X等等怎么看都和10有关系,他们可能也是差不多的想法?
那我们就考虑只是去拼写每一位的数字在拼接起来,发现和那些奇奇妙妙的限制正好吻合
而且对于每一个数位,都有1,5,10的结构,如10,50,100,500,1000等
每一位的表示规则完全相同只是字母不一样
而且间距也是相同的
那么从最低位开始,判断当前位是1~9的哪一个,然后用不同的写法
有一个叫做string的东西可以通过“+”直接拼接,很好用

完整代码:

#include
#include
#include
using namespace std;

int T=0;
string mp[]={"I","V","X","L","C","D","M","v","x","l","c","d","m"};

void sov(int tmp)
{
    int i=0;
    string ans="";
    while(tmp)
    {
        int x=tmp%10;
        if(x==1) ans=mp[i]+ans;
        else if(x==2) ans=mp[i]+mp[i]+ans;
        else if(x==3) ans=mp[i]+mp[i]+mp[i]+ans;
        else if(x==4) ans=mp[i]+mp[i+1]+ans;
        else if(x==5) ans=mp[i+1]+ans;
        else if(x==6) ans=mp[i+1]+mp[i]+ans;
        else if(x==7) ans=mp[i+1]+mp[i]+mp[i]+ans;
        else if(x==8) ans=mp[i+1]+mp[i]+mp[i]+mp[i]+ans;
        else if(x==9) ans=mp[i]+mp[i+2]+ans;
        i+=2,tmp/=10;
    }
    cout << ans << endl ;
}

int main()
{
    scanf("%d",&T);
    while(T--)
    {
        int x;
        scanf("%d",&x);
        sov(x);
    }
    return 0;
}

嗯,就是这样

你可能感兴趣的:(leetcode:Integer to Roman 浅谈古罗马OI生活之数字的研究)