leetcode 12 Integer to Roman

Integer to Roman
Total Accepted: 39957 Total Submissions: 116987

Given an integer, convert it to a roman numeral.

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

这道题目的要求简洁明了,要求我们将输入的阿拉伯数字转化为罗马数字,罗马数字的规则可以参见http://www.douban.com/note/335254352/ ,看了之后觉得好麻烦,但事实上作为计量的工具,如果人们用它之前还需要套用如此多的规则来找出正确的写法,那么这种数字应该很快就被淘汰了,因为它阻碍人们的交流。而实际上罗马数字却在阿拉伯数字流入欧洲之前被广泛使用,说明只要掌握了要领,罗马数字是可以很简单地写出来的。这种要领在我看来就是查表,其实人脑中存的就是一张表,需要书写是直接查表,而不是计算。至于这张表是什么样的见仁见智。针对这一题,我构造了下面这张表:

1000100101
MCXI
2000200202
MMCCXXII
3000300303
MMMCCCXXXIII
400404
CDXLIV
500505
DLV
600606
DCLXVI
700707
DCCLXXVII
800808
DCCCLXXXVIII
900909
CMXCIX

有了这张表的好处是题目要求的1-3999,这3999个数全部可以通过查表的方式获得。例如:3481这个数,我们就查3000,400 80,1,所以对应的罗马数字为MMM, CD, LXXX,I,因此3481对应的罗马数字就是MMMCDLXXXI。所以通过上面的描述我们自然可以想到这道题的解法,就是先建表,然后按序每次取出1位,通过查表获得对应的罗马数字,然后把所有的罗马数字连起来就是最后的答案。

下面是完整程序代码:

#include <stdlib.h>
#include <iostream>
using namespace std;


char* intToRoman(int num) 
{
    char *table[4][10];
    table[0][0] = ""; table[0][1] = "I", table[0][2] = "II", table[0][3] = "III", table[0][4] = "IV", 
    table[0][5] = "V", table[0][6] = "VI", table[0][7] = "VII", table[0][8] = "VIII", table[0][9] = "IX";

    table[1][0] = ""; table[1][1] = "X", table[1][2] = "XX", table[1][3] = "XXX", table[1][4] = "XL", 
    table[1][5] = "L", table[1][6] = "LX", table[1][7] = "LXX", table[1][8] = "LXXX", table[1][9] = "XC";

    table[2][0] = ""; table[2][1] = "C", table[2][2] = "CC", table[2][3] = "CCC", table[2][4] = "CD", 
    table[2][5] = "D", table[2][6] = "DC", table[2][7] = "DCC", table[2][8] = "DCCC", table[2][9] = "CM";

    table[3][0] = ""; table[3][1] = "M", table[3][2] = "MM", table[3][3] = "MMM";

    char *RomanNumeral = (char*)malloc(sizeof(char) * 20);
    RomanNumeral[0] = '\0';
    int i = 0;
    int indices[4];
    while(num != 0)
    {
        indices[i++] = num % 10;
        num = num / 10;
    }

    for(int j = i-1; j >= 0; j--)
    {
        strcat(RomanNumeral, table[j][indices[j]]);
    }
    return RomanNumeral;
}

int main()
{
    int num;
    cout<<"Input the number:"<<endl;
    cin>>num;
    char *s = intToRoman(num);
    cout<<s<<endl;
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值