Integer to Roman - Leetcode

来源:互联网 发布:软件设计师视频下载 编辑:程序博客网 时间:2024/06/17 00:05

题意:将整型数转换成罗马数字。(记得之前在户部巷玩,有路边摆摊的说一个不错的写出罗马数字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;    }};
0 0
原创粉丝点击