Integer to Roman - Leetcode

26 篇文章 0 订阅

题意:将整型数转换成罗马数字。(记得之前在户部巷玩,有路边摆摊的说一个不错的写出罗马数字1到100,礼品随便挑。做完这一题估计可以去试试了)

在做此题之前,需要弄清楚罗马数字的基本字符和规则。
1 5 10 50 100 500 1000
I V X L C D M

1.相同的数字连写、所表示的数等于这些数字相加得到的数、如:Ⅲ=3;
2.小的数字在大的数字的右边、所表示的数等于这些数字相加得到的数、 如:Ⅷ=8、Ⅻ=12;
3.小的数字、(限于 Ⅰ、X 和 C)在大的数字的左边、所表示的数等于大数减小数得到的数、如:Ⅳ=4、Ⅸ=9;
4.正常使用时、连写的数字重复不得超过三次。(表盘上的四点钟“IIII”例外);
5.在一个数的上面画一条横线、表示这个数扩大 1000 倍。
思路很简单,将数每一位分离,存入数组,然后一次求出每一位的罗马数字存入字符串,随后输出。

class Solution {
public:
    string intToRoman(int num) {
        int number[4];
        string s="";
        for(int i=0;i<4;i++)
            number[i]=0;
        int i=0;
        while(num!=0)
        {
            number[i++]=num%10;
            num=num/10;
        }
        for(int j=0;j<i;j++)
        {
            if(j==0)
            {
                if(1<=number[j]&&number[j]<4)
                    for(int k=0;k<number[j];k++)
                      s.insert(0,"I");
                else if(number[j]==4)
                    s.insert(0,"IV");
                else if(number[j]>4&&number[j]<9)
                {
                    for(int k=1;k<=number[j]-5;k++)
                        s.insert(0,"I");
                    s.insert(0,"V");
                }
                else if(number[j]==9)
                    s.insert(0,"IX");
            }
            if(j==1)
            {
                if(1<=number[j]&&number[j]<4)
                    for(int k=0;k<number[j];k++)
                      s.insert(0,"X");
                else if(number[j]==4)
                    s.insert(0,"XL");
                else if(number[j]>4&&number[j]<9)
                {
                    for(int k=1;k<=number[j]-5;k++)
                        s.insert(0,"X");
                    s.insert(0,"L");
                }
                else if(number[j]==9)
                    s.insert(0,"XC");
            }
            if(j==2)
            {
                if(1<=number[j]&&number[j]<4)
                    for(int k=0;k<number[j];k++)
                      s.insert(0,"C");
                else if(number[j]==4)
                    s.insert(0,"CD");
                else if(number[j]>4&&number[j]<9)
                {
                    for(int k=1;k<=number[j]-5;k++)
                        s.insert(0,"C");
                    s.insert(0,"D");
                }
                else if(number[j]==9)
                    s.insert(0,"CM");
            }
            if(j==3)
            {
                if(1<=number[j]&&number[j]<4)
                    for(int k=0;k<number[j];k++)
                      s.insert(0,"M");
            }
        }
        return s;
    }
};

这种做法要对每种情况进行判断,比较麻烦,学习了网上一种比较简洁的做法。将特殊的需要标记出来的罗马数字先存入数组中,处理num的过程就是以此让num减去value中比num小的最大的数,然后把它对应的罗马数字存到字符串s中。

class Solution {
public:
    string intToRoman(int num) {
        int values[13] = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 };  
        string numerals[13] = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I" };  
        string result;  
        for (int i = 0; i < 13; i++) {  
            while (num >= values[i]) {  
                num -= values[i];  
                result+=numerals[i];  
            }  
        }  
        return result;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值