转换罗马数字

实践练习C++17

简介

如今世界大多数人使用阿拉伯数字 0 至 9;如果回到两千年前,大多数欧洲人使用的则是罗马数字。

罗马数字使用以下拉丁字母,各有固定数值:

M D C L X V I
1000 500 100 50 10 5 1

罗马数字由这些字母组成,通常将其数值相加。例如 XVIII 表示 18,即 10 + 5 + 1 + 1 + 1。

还有一条重要规则:相同字母不能连续超过三次。因此不能用看似自然的 IIII 表示 4,而应使用减法,把它看作 5 - 1,并把小数写在前面。只有以下情况采用这种形式:4 为 IV,9 为 IX,40 为 XL,90 为 XC,400 为 CD,900 为 CM。

顺序非常重要!字母及上述减法组合,必须从左到右按数值递减排列。

例如:

 105 => CV
---- => --
 100 => C
+  5 =>  V
 106 => CVI
---- => --
 100 => C
+  5 =>  V
+  1 =>   I
 104 => CIV
---- => ---
 100 => C
+  4 =>  IV

最后再看一个较复杂的示例:

 1996 => MCMXCVI
----- => -------
 1000 => M
+ 900 =>  CM
+  90 =>    XC
+   5 =>      V
+   1 =>       I

任务说明

将阿拉伯数字转换为罗马数字。

本练习只处理传统形式,最大为 MMMCMXCIX,即 3999。

建议 转换方法有很多。可先采用直观方法熟悉罗马数字,再查找更高效的实现。

原课程还提供不同解法的深入讨论;完成基础实现后,可以继续比较不同转换策略。