力扣刷题:12. 整数转罗马数字

题目要求

在这里插入图片描述
在这里插入图片描述

代码:千位、百位、十位、个位依次处理

class Solution {
public:
    map<int,string> m;
    string intToRoman(int num) {
        string roman;
        //存储数字各个位(个位、十位、百位)上的数
        int bitNumber;
        mapInit();

        bitNumber = num / 1000;
        strRomanFun(roman, bitNumber, 1000);
        num %= 1000;

        bitNumber = num / 100;
        strRomanFun(roman, bitNumber, 100);
        num %= 100;

        bitNumber = num / 10;
        strRomanFun(roman, bitNumber, 10);
        num %= 10;

        bitNumber = num / 1;
        strRomanFun(roman, bitNumber, 1);
        num %= 1;
        return roman;
    }

    void mapInit()
    {
        m[1] = "I";
        m[4] = "IV";
        m[5] = "V";
        m[9] = "IX";

        m[10] = "X";
        m[40] = "XL";
        m[50] = "L";
        m[90] = "XC";

        m[100] = "C";
        m[400] = "CD";
        m[500] = "D";
        m[900] = "CM";

        m[1000] = "M";
    }
    void strRomanFun(string& Roman, int bitNumber, int bit)
    {
        if (bitNumber == 4)
        {
            Roman += m[4 * bit];
        }
        else if (bitNumber == 9)
        {
            Roman += m[9 * bit];
        }
        else
        {
            if (bitNumber / 5)
            {
                Roman += m[5 * bit];
            }
            for (size_t i = 0; i < (bitNumber%5); i++)
            {
                Roman += m[bit];
            }
        }
    }
};
预先设计

在类内定义了一个成员变量map,这样可以三个函数都可以方便的访问到该map。
子功能函数mapInit负责初始化map
子功能函数strRomanFun负责按位追加字符串

整体思路

首先定义一个map,里面储存了数字和与之相对应的罗马字符。
接着按照千位、百位、十位、个位的顺序进行罗马字符的转换:

  • 如果该位上的数字等于0,跳过该位
  • 如果该位上的数字大于0小于4,则在字符串后面添加相应个数的该位的‘1值’
  • 如果该位上的数字等于4,则在字符串后面添加该位的‘4值’
  • 如果该位上的数字大于4小于9,则在字符串后面添加该位的‘5值’和剩余的‘1值’
  • 如果该位上的数字等于9,则在字符串后面添加该位的‘9值’

以1994举个例子:
一开始字符串初始为空

首先是千位上的数字1,因为1是大于0小于4的,所以应该再字符串后面添加1个千位上的‘1值’,也就是’M’。“M”

接着是百位上的数字9,在字符串后面添加百位的‘9值’,也就是900的’CM’。“MCM”

接着是十位上的数字0,在字符串后面添加十位的‘9值’,也就是90的’XC’。“MCMXC”

最后是个位上的数字4,在字符串后面添加个位的‘4值’,也就是4的’IV’。“MCMXCIV”

学到了什么

1、重新学习了map插入元素的方法

  • 用insert插入pair
  • 用insert插入value_type
  • 用array的方法

m[1] = "I";

本题中我使用了第三种方法,需要注意的是,如果map里面原来就存在有一个值,这种方法会把旧值给覆盖掉。

map容器操作的参考文章

结果

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值