整数转罗马数字(C++)

本文介绍了将整数转换为罗马数字的两种方法:贪心算法和暴力穷举。详细解析了每种方法的实现过程,包括如何处理特殊规则如4和9的表示,并通过示例展示了算法的正确性。内容涵盖了算法设计和字符串操作,适合对编程和算法感兴趣的读者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

整数转罗马数字

描述

罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。

字符          数值
I             1
V             5
X             10
L             50
C             100
D             500
M             1000

例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II

通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:

  • I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
  • X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。
  • C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。

给你一个整数,将其转为罗马数字。

示例1

输入: num = 3
输出: "III"

示例2

输入: num = 4
输出: "IV"

示例3

输入: num = 9
输出: "IX"

示例4

输入: num = 58
输出: "LVIII"
解释: L = 50, V = 5, III = 3.

示例5

输入: num = 1994
输出: "MCMXCIV"
解释: M = 1000, CM = 900, XC = 90, IV = 4.

提示:

  • 1 <= num <= 3999

思路/解法

方式一

贪心算法。先将所有的情况从大到小列举出来并用list容器保存,然后每次处理都认为给定的数num能从最大的数值开始处理,直至num为0。

class Solution {
public:
    struct Item
    {
	    std::string str;
	    int value;
    };
    string intToRoman(int num) {
        std::list<Item> lists{ {"M",1000}, {"CM",900},{"D",500},{"CD",400},{"C",100},
		{"XC",90}, {"L",50},{"XL",40},{"X",10},{"IX",9},{"V",5},{"IV",4},{"I",1} };

	    std::string res;
	    while (num != 0)
	    {
		    if (num - lists.front().value >= 0)
		    {
			    num -= lists.front().value;
			    res += lists.front().str;
			    continue;
		    }
		    lists.pop_front();
	    }
	    return res;
    }
};

方式二

暴力穷举。

作者:z1m

链接:https://leetcode.cn/problems/integer-to-roman/solution/tan-xin-ha-xi-biao-tu-jie-by-ml-zimingmeng/

class Solution {
public:
    string intToRoman(int num) {
        string table[4][10] = { 
            // 1~9
            {"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"},
            // 10~90
            {"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"},
            // 100~900
            {"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"}, 
            // 1000~3000
            {"", "M", "MM", "MMM"} 
        };
        string result;
        int count = 0;
        while(num > 0){
            int temp = num % 10;
            result = table[count][temp] + result;
            num /= 10;
            count++;
        }
        return result;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ufgnix0802

总结不易,谢谢大家的支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值