您的位置:首页 > 编程语言 > C语言/C++

LeetCode之12_Integer to Roman

2016-06-16 23:08 429 查看
题目原文:

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;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode c++