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