题目原文:
Given an integer, convert it to a roman numeral.
Input is guaranteed to be within the range from 1 to 3999.
Subscribe to see which companies asked this question
题目分析:
将数字转换为罗马数字的表达方式,,范围从1到4000
找到阿拉伯数字与罗马数字之间的对应关系,通过规律进行转换,对5左右的情况做特别的处理
解题代码:
//1~9: {"I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"};
//
//10~90: {"X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"};
//
//100~900: {"C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"};
//
//1000~3000: {"M", "MM", "MMM"}.
// 将数字转换为罗马数字的表达方式,,范围从1到4000
#include <iostream>
#include <string>
using namespace std;
class Solution {
public:
string intToRoman(int num) {
int nTemp = 0;
int nWeght = 0;
string nRet = "";
while (num != 0)
{
nTemp = num % 10;
num = num / 10;
if (nWeght == 0)
{
nWeght = 1;
}
else
nWeght = nWeght*10;
nRet = getRightOrder(nTemp,nWeght)+nRet ;
}
return nRet;
}
//输入某位的数字和对应的权重,返回其对应的罗马数字
string getRightOrder(int nNum, int nWeight)
{
string strRet;
if (nNum == 9)
{
strRet = getRoman(1*nWeight,1) + getRoman(nWeight*10,1);
}
else if (nNum >= 5)
{
strRet = getRoman(5*nWeight,1) + getRoman(nWeight,nNum-5);
}
else if (nNum == 4)
{
strRet = getRoman(nWeight,1) + getRoman(5*nWeight,1);
}
else if (nNum > 0)
{
strRet = getRoman(nWeight,nNum);
}
else
strRet = "";
return strRet;
}
//要表达的数字及重复的次数
string getRoman(int nsize ,int nRep)
{
string sRet = "";
string sOut = "";
switch(nsize)
{
case 1:
sRet = "I";
break;
case 5:
sRet = "V";
break;
case 10:
sRet = "X";
break;
case 50:
sRet = "L";
break;
case 100:
sRet = "C";
break;
case 500:
sRet = "D";
break;
case 1000:
sRet = "M";
break;
}
for (int i=0; i<nRep; i++)
{
sOut= sOut + sRet;
}
return sOut;
}
};