Leetcode Problem12

43 篇文章 0 订阅

Integer to Roman

阿拉伯数字转罗马数字的问题,其实解法很简单。我们现在已知的数有1,5,10,50,100,500和1000,而且题目中还告诉我们凡是4和9的数字都比较特殊,题目限制数字范围是1-3999,所以我们还可以知道4,9,40,90,400,900这几个比较特殊的数字。然后我们将该数字逐一减去其可以减的最大的数字(在已知的罗马数字中搜索),直到为零,将所有减去的罗马数字一一排列返回即可。

string Symbol(int val) //数字转符号
{
    if(val>=1000) return "M";
    else if(val>=900) return "CM";
    else if(val>=500) return "D";
    else if(val>=400) return "CD";
    else if(val>=100) return "C";
    else if(val>=90) return "XC";
    else if(val>=50) return "L";
    else if(val>=40) return "XL";
    else if(val>=10) return "X";
    else if(val>=9) return "IX";
    else if(val>=5) return "V";
    else if(val>=4) return "IV";
    else if(val>=1) return "I";
}

int Value(string sym) //符号转数字
{
    if(sym=="I") return 1;
    else if(sym=="IV") return 4;
    else if(sym=="V") return 5;
    else if(sym=="IX") return 9;
    else if(sym=="X") return 10;
    else if(sym=="XL") return 40;
    else if(sym=="L") return 50;
    else if(sym=="XC") return 90;
    else if(sym=="C") return 100;
    else if(sym=="CD") return 400;
    else if(sym=="D") return 500;
    else if(sym=="CM") return 900;
    else if(sym=="M") return 1000;
}

int Size(int num,int tmp) //求解当前数字是几位数
{
    while(num/tmp>0) 
    {
        tmp*=10;
    }
    tmp/=10; 
    return tmp;
}

string intToRoman(int num)
{
    int tmp=10,m;
    tmp=Size(num,tmp);
    string res="";
    while(true)
    {
        m=num/tmp*tmp;
        if(m==0) return res;
        res+=Symbol(m);
        tmp=10;
        num-=Value(Symbol(m)); //减去已取出的数字
        tmp=Size(num,tmp);
    }
    return res;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值