首页 > 试题广场 >

整数转罗马数字

[编程题]整数转罗马数字
  • 热度指数:74 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
罗马数字包含以下七种字符: 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 到 3999 的范围内。

输入描述:
输入为数值


输出描述:
输出为罗马数字字符串
示例1

输入

2

输出

II
示例2

输入

1

输出

I
按照题意分情况讨论,对特殊情况进行单独处理就行
num = int(input())
# 将数字按个十百千拆开
digit = []
i = 0
while num:
    digit.append((num % 10)*10**i)
    num //= 10
    i += 1
n = len(digit)
res = ""
for i in range(n - 1, -1, -1):
    if i == 3:
        numOf1000 = digit[i] // 10**i
        res += 'M'*numOf1000
    elif i == 2:
        numOf100 = digit[i] // 10**i
        if numOf100 <= 3:
            res += 'C'*numOf100
        elif numOf100 <= 5:
            res += 'C'*(5 - numOf100) + 'D'
        elif numOf100 <= 8:
            res += 'D' + 'C'*(numOf100 - 5)
        elif numOf100 <= 9:
            res += "CM"
    elif i == 1:
        numOf10 = digit[i] // 10**i
        if numOf10 <= 3:
            res += 'X'*numOf10
        elif numOf10 <= 5:
            res += 'X'*(5 - numOf10) + 'L'
        elif numOf10 <= 8:
            res += 'L' + 'X'*(numOf10 - 5)
        elif numOf10 <= 9:
            res += "XC"
    else:
        numOf1 = digit[i] // 10**i
        if numOf1 <= 3:
            res += 'I'*numOf1
        elif numOf1 <= 5:
            res += 'I'*(5 - numOf1) + 'V'
        elif numOf1 <= 8:
            res += 'V' + 'I'*(numOf1 - 5)
        elif numOf1 <= 9:
            res += "IX"
print(res)

编辑于 2021-04-12 12:06:26 回复(0)

逐位处理,分类讨论。

#include <iostream>
#include <vector>
#include <string>

using namespace std;

int main(){
    int num;
    cin >> num;
    string result = "";
    vector<int> bit;
    while(num){
        bit.push_back(num % 10);
        num /= 10;
    }
    for(int i = bit.size() - 1;i > -1;i--){
        if(bit[i] == 4){
            if(i == 0){
                result += "IV";
            }
            else if(i == 1){
                result += "XL";
            }
            else if(i == 2){
                result += "CD";
            }
        }
        else if(bit[i] == 9){
            if(i == 0){
                result += "IX";
            }
            else if(i == 1){
                result += "XC";
            }
            else if(i == 2){
                result += "CM";
            }
        }
        else if(bit[i] < 5){
            int counter = 0;
            while(counter != bit[i]){
                if(i == 0){
                    result += "I";
                }
                else if(i == 1){
                    result += "X";
                }
                else if(i == 2){
                    result += "C";
                }
                else if(i == 3){
                    result += "M";
                }
                counter++;
            }
        }
        else {
            if(i == 0){
                result += "V";
            }
            else if(i == 1){
                result += "L";
            }
            else if(i == 2){
                result += "D";
            }
            int counter  = 0;
            while(counter != bit[i] - 5){
                if(i == 0){
                    result += "I";
                }
                else if(i == 1){
                    result += "X";
                }
                else if(i == 2){
                    result += "C";
                }
                counter++;
            }
        }
    }
    cout << result << endl;
}
发表于 2022-04-13 15:39:27 回复(0)
#include <iostream>

#define REG(x,entry)\
    x("M",1000,entry)\
    x("CM",900,entry)\
    x("D",500,entry)\
    x("CD",400,entry)\
    x("C",100,entry)\
    x("XC",90,entry)\
    x("L",50,entry)\
    x("XL",40,entry)\
    x("X",10,entry)\
    x("IX",9,entry)\
    x("V",5,entry)\
    x("IV",4,entry)\
    x("I",1,entry)
#define CODE_PRE(LUO,num,entry)\
    while(entry>=num)\
    {\
        std::cout << LUO;\
        entry=entry-num;\
    }
#define TURN(entry)\
    REG(CODE_PRE,entry)

int main()
{
    int num;
    while(std::cin>>num)
    {
        TURN(num)
        std::cout<<std::endl;
    }
}

发表于 2021-05-17 18:02:00 回复(0)