第十二题:整数转罗马数字

题目描述

给定一个整数,将其转换为罗马数字。输入确保在 1 到 3999 的范围内。

实现思路

创建一个映射表存储罗马数字的字符与对应的数值。从大到小遍历映射表中的数值,每次尝试将当前数值减去输入的整数,并将对应的罗马字符添加到结果字符串中,直到输入的整数小于当前数值为止。重复此过程直到输入的整数变为0。

算法实现

C

#include <stdio.h>
#include <string.h>

char *intToRoman(int num) {
    int values[] = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
    char *romans[] = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
    char *res = malloc(16);
    memset(res, '0', 15); // Allocate and initialize to avoid undefined behavior.
    res[15] = '\0'; // Null terminate the string.
    int i = 0, index = 0;
    while (num > 0) {
        for (; num >= values[i]; i++) {
            strcat(res, romans[i]);
            num -= values[i];
        }
        i++;
    }
    return res;
}

Python

def int_to_roman(num):
    val = [
        1000, 900, 500, 400,
        100, 90, 50, 40,
        10, 9, 5, 4,
        1
        ]
    syms = [
        "M", "CM", "D", "CD",
        "C", "XC", "L", "XL",
        "X", "IX", "V", "IV",
        "I"
        ]
    roman_num = ''
    i = 0
    while num > 0:
        for _ in range(num // val[i]):
            roman_num += syms[i]
            num -= val[i]
        i += 1
    return roman_num

Java

public class Solution {
    public String intToRoman(int num) {
        int values[] = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
        String romans[] = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
        StringBuilder res = new StringBuilder();
        for (int i = 0; num > 0; i++) {
            while (num >= values[i]) {
                res.append(romans[i]);
                num -= values[i];
            }
        }
        return res.toString();
    }
}
时间复杂度

O(1) - 因为输入范围固定且有限,循环次数不会超过固定的次数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

冰魄雕狼

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值