七个不同的符号代表罗马数字,其值如下:
| 符号 | 值 |
|---|---|
| I | 1 |
| V | 5 |
| X | 10 |
| L | 50 |
| C | 100 |
| D | 500 |
| M | 1000 |
罗马数字是通过添加从最高到最低的小数位值的转换而形成的。将小数位值转换为罗马数字有以下规则:
- 如果该值不是以 4 或 9 开头,请选择可以从输入中减去的最大值的符号,将该符号附加到结果,减去其值,然后将其余部分转换为罗马数字。
- 如果该值以 4 或 9 开头,使用 减法形式,表示从以下符号中减去一个符号,例如 4 是 5 (
V) 减 1 (I):IV,9 是 10 (X) 减 1 (I):IX。仅使用以下减法形式:4 (IV),9 (IX),40 (XL),90 (XC),400 (CD) 和 900 (CM)。 - 只有 10 的次方(
I,X,C,M)最多可以连续附加 3 次以代表 10 的倍数。你不能多次附加 5 (V),50 (L) 或 500 (D)。如果需要将符号附加4次,请使用 减法形式。
给定一个整数,将其转换为罗马数字。
示例 1:
输入:num = 3749
输出: "MMMDCCXLIX"
解释:
3000 = MMM 由于 1000 (M) + 1000 (M) + 1000 (M) 700 = DCC 由于 500 (D) + 100 (C) + 100 (C) 40 = XL 由于 50 (L) 减 10 (X) 9 = IX 由于 10 (X) 减 1 (I) 注意:49 不是 50 (L) 减 1 (I) 因为转换是基于小数位
示例 2:
输入:num = 58
输出:"LVIII"
解释:
50 = L 8 = VIII
示例 3:
输入:num = 1994
输出:"MCMXCIV"
解释:
1000 = M 900 = CM 90 = XC 4 = IV
解题思路:
首先,我们需要定义罗马数字符号以及它们所代表的十进制数值。为了方便使用贪心算法,我们将这些值按照从大到小的顺序排列。在 Java 代码中,可以使用两个数组来存储这些信息;使用一个循环来不断从输入的整数中减去最大可能的罗马数字对应的值,并将相应的符号添加到结果字符串中,直到整数减为 0。在 Java 中可以使用双重 while 循环来实现:外层 while 循环的条件是 num > 0,只要整数还不为 0,就继续进行转换。内层 while 循环的条件是 num >= VALUES[i],表示当当前的整数大于或等于当前罗马数字对应的值时,将对应的符号添加到结果中,并从整数中减去该值。每次内层循环结束后,将索引 i 加 1,尝试下一个较小的罗马数字对应的值。
具体代码:
import java.util.Scanner;
public class ExtendedIntegerToRoman {
// 定义罗马数字对应的数值和符号
private static final int[] VALUES = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
private static final String[] SYMBOLS = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
/**
* 将整数转换为罗马数字
* @param num 要转换的整数
* @return 转换后的罗马数字字符串
*/
public static String intToRoman(int num) {
if (num <= 0) {
throw new IllegalArgumentException("输入的数字必须大于 0。");
}
StringBuilder result = new StringBuilder();
int i = 0;
while (num > 0) {
while (num >= VALUES[i]) {
result.append(SYMBOLS[i]);
num -= VALUES[i];
}
i++;
}
return result.toString();
}
public static String largeIntToRoman(long num) {
if (num <= 0) {
throw new IllegalArgumentException("输入的数字必须大于 0。");
}
StringBuilder result = new StringBuilder();
// 处理超过 3999 的部分,以 1000 为一组
long thousands = num / 1000;
for (long i = 0; i < thousands; i++) {
result.append("M");
}
// 处理剩余部分
int remainder = (int) (num % 1000);
if (remainder > 0) {
result.append(intToRoman(remainder));
}
return result.toString();
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
try {
System.out.print("请输入一个大于 0 的整数: ");
long inputNumber = scanner.nextLong();
String romanNumber;
if (inputNumber <= Integer.MAX_VALUE) {
romanNumber = intToRoman((int) inputNumber);
} else {
romanNumber = largeIntToRoman(inputNumber);
}
System.out.println("对应的罗马数字是: " + romanNumber);
} catch (IllegalArgumentException e) {
System.out.println(e.getMessage());
} catch (Exception e) {
System.out.println("输入无效,请输入一个有效的整数。");
} finally {
scanner.close();
}
}
}
运行截图:

2921

被折叠的 条评论
为什么被折叠?



