LeetCode 12.Integer to Roman

xiaoxiao2021-02-27  336

题目

        Given an integer, convert it to a roman numeral.Input is guaranteed to be within the range from 1 to 3999.

分析

罗马数字计数方法 header 1header 2罗马字符证书数字I1V5X10L50C100D500M1000

- 规则 - 相同的数字连写,所表示的数等于这些数字相加得到的数,如III=3 - 小的数字在大的数字右边,所表示的数等于这些数据相加得到的数VIII=8,XII=12 - 小的数字,限于I、X、C在大的数字左边,所表示的数等于大数减去小数得到的数,如IV=4,IX=9; - 正常使用时,连写的数字重复不得超过三次 - 在一个数的上面画一条横线,表示这个数扩大1000倍 - 注意事项 - 基本数字I、X、C中的任何一个 自身连用构成数目,或者放在大数右边构成数目,都不能超过三个,放在大数左边不能超过一个 - 不能把基本数字VLD中的任何一个作为小数放在大数的左边采用相减的方法构成数目,放在大数的右边采用相加的方式构成数目,只能使用一个 - V和X的左边的小数字只能用I,且只能有一个 - L和C左边的小数字只能用X,且只能有一个 - D和M左边的小数字只能用C,且只能有一个 - 算法:对数字的每位逐个判断 - 如果该位数字是9,则说明是上面3、4、5这三种情况中的一种,即把I、X、C中的一个放到了大数字的左侧; - 如果该位数字是5~8,则说明是上面1这种情况,即I、X、C中的一个,自身连用或者放在大数的右边连用; - 如果该位数字是4,则说明同样是上面3、4、5这三种情况中的一种,即把I、X、C中的一个放到了大数字的左侧; - 如果该位数字是0~3,则同样说明是上面1这种情况,即I、X、C中的一个,自身连用或者放在大数的右边连用。

代码

std::string intToRoman2(int num) { std::string s = ""; if (num > 0 && num <= 3999){ std::cout << num << std::endl; int n1[] = { 1000, 100, 10, 1 }; char r1[] = { 'M', 'C', 'X', 'I' }; char r2[] = { ' ', 'D', 'L', 'V' }; for (int i = 0; i < 4; ++i) { int b = num / n1[i]; if (b == 9) s = s + r1[i] + r1[i - 1]; else if (b >= 5) { s += r2[i]; for (int j = 0; j < b - 5; ++j) s += r1[i]; } else if (b == 4) s = s + r1[i] + r2[i]; else { for (int j = 0; j < b; ++j) s += r1[i]; } num = num % n1[i]; } } return s; }
转载请注明原文地址: https://www.6miu.com/read-3104.html

最新回复(0)