【LeetCode】Integer to Roman

题目描述

Integer to Roman

 

Given an integer, convert it to a roman numeral.

Input is guaranteed to be within the range from 1 to 3999.


题目分析

就是给出一个整数,求出罗马数字的表达示。
思路不难,做一个映射表,
mp[1] = "I";     mp[5] = "V";
        mp[10] = "X";   mp[50] = "L";
        mp[100] = "C";   mp[500] = "D";
        mp[1000] = "M";
整数后面往前判断,并记录进行到哪一位。
while(num)
        {
        	tmp = num%10;
        	switch(tmp)
        	{
        		case 0:
       				break;
       			case 1:case 2:case 3:
	       			while(tmp--)
						ret = mp[cmpnum] + ret;
       				break;       			
       			case 4:case 9:
       				ret = mp[(tmp+1)*cmpnum] + ret;
       				ret = mp[cmpnum] + ret;
       				break;       			
       			case 5:
       				ret = mp[cmpnum*5] + ret;
       				break;
  				case 6:case 7:case 8:
  					while((tmp--)-5)
						ret = mp[cmpnum] + ret;
  					ret = mp[cmpnum*5] + ret;  					
				  	break; 
			}
			cmpnum *= 10;
			num = num/10;	
		}


如:3654
开始,记录一个cmpnum = 1,表示进行到个位
3654%10 = 4;
对于4,我们在结果前加一个mp[cmpnum*5]对应的值,再添加一个mp[cmpnum]代表的值,添加一个IV,此时结果是IV


循环下一次365%10=5,cmpnum = 10
对于5,我们在结果前加一个mp[cmpnum*5]对应的值就行,添加一个L,此时结果是LIV

循环下一次36%10=6,cmpnum = 100
对于6,我们在结果前加一个mp[cmpnum]对应的值,再添加一个mp[cmpnum]*5代表的值,添加一个DC,此时结果是DCLIV

循环下一次3%10=3,cmpnum = 1000
判断3,根据上面的条件,我们在结果里添加三次mp[cmpnum]代表的值就是MMM,此时结果是MMMDCLIV。

代码示例

#include 
   
    
#include 
     
using namespace std;
//要想明白是从前到后还是从后到前 
//罗马数字 
#if 1
class Solution {
public:
    string intToRoman(int num) {
        map
     
       mp;
        mp[1] = "I";    mp[5] = "V";
        mp[10] = "X";   mp[50] = "L";
        mp[100] = "C";  mp[500] = "D";
        mp[1000] = "M";
        string ret;
        int tmp = 0, cmpnum = 1;
        while(num)
        {
        	tmp = num%10;
        	switch(tmp)
        	{
        		case 0:
       				break;
       			case 1:case 2:case 3:
	       			while(tmp--)
						ret = mp[cmpnum] + ret;
       				break;       			
       			case 4:case 9:
       				ret = mp[(tmp+1)*cmpnum] + ret;
       				ret = mp[cmpnum] + ret;
       				break;       			
       			case 5:
       				ret = mp[cmpnum*5] + ret;
       				break;
  				case 6:case 7:case 8:
  					while((tmp--)-5)
						ret = mp[cmpnum] + ret;
  					ret = mp[cmpnum*5] + ret;  					
				  	break; 
			}
			cmpnum *= 10;
			num = num/10;	
		}
		return ret;
    }
};
#elif 0
class Solution {
public:
    const string romans[4][10] = {
        {"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"},
        {"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"},
        {"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"},
        {"", "M", "MM", "MMM", "", "", "", "", "", ""}
    };
    
    string intToRoman(int num) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function    
        string ans = "";
        int idx = 0;
        while (num != 0) {            
            ans = romans[idx][num % 10] + ans;
            num /= 10;
            idx++;
        }
        return ans;
    }
};
#endif
void test0(string x,int expect)
{
	Solution so;
	string ret = so.intToRoman(expect);
	if(ret != x)
		printf("------------------------%s<>%s failed\n",x.c_str(),ret.c_str());
	else
		printf("------------------------passed\n");
}
int main(int argc, char *argv[])
{
	test0("I",1);
	test0("II",2);
	test0("IV",4);
	test0("V",5);
	test0("VI",6);
	test0("MMMCMXCIX",3999);
	test0("MMMDCLIV",3654);
	return 0;
}

     
   



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值