每日一题--数字转罗马数字--两种解法

题目

在这里插入图片描述

解法一(模拟贪心)

既然称为了贪心,那么肯定就是一直想着取最大就行了
这个题解我习得了pair的用法,不能在类中初始化。


const pair<int,string>simulat[] = {
    {1000,"M"},
    {900,"CM"},
    {500,"D"},
    {400,"CD"},
    {100,"C"},
    {90,"XC"},
    {50,"L"},
    {40,"XL"},
    {10,"X"},
    {9,"IX"},
    {5,"V"},
    {4,"IV"},
    {1,"I"}
};
class Solution {
public:

    string intToRoman(int num) {
        string res = "";
        for(auto[val,str]:simulat){
        //不断循环取最大的,直到比它小
            while(num>=val){
                res += str;
                num -= val;
            }
          //一旦出现numi = 0 的情况就说明🆗了
            if(num==0)
                break;
        }
        return res;
    }
};

解法二(模拟十进制硬解)


//空字符代表0,而由于最高只到了3999所以千位只需到3
const string thousands[] = {"", "M", "MM", "MMM"};
const string hundreds[]  = {"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"};
const string tens[]      = {"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"};
const string ones[]      = {"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"};

class Solution {
public:
    string intToRoman(int num) {
        return thousands[num / 1000] + hundreds[num % 1000 / 100] + tens[num % 100 / 10] + ones[num % 10];
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值