原题目:
Given an integer, convert it to a roman numeral.
Input is guaranteed to be within the range from 1 to 3999.
给定一个数字,将其转换成为罗马数字输出
算法分析:
罗马数字构成:
罗马数字共有7个,即Ⅰ(1)、Ⅴ(5)、Ⅹ(10)、Ⅼ(50)、Ⅽ(100)、Ⅾ(500)和Ⅿ(1000)。按照下述的规则可以表示任意正整数。需要注意的是罗马数字中没有“0”,与进位制无关。一般认为罗马数字只用来记数,而不作演算。
- 重复数次:一个罗马数字重复几次,就表示这个数的几倍。
- 右加左减:
- 在较大的罗马数字的右边记上较小的罗马数字,表示大数字加小数字。
- 在较大的罗马数字的左边记上较小的罗马数字,表示大数字减小数字。
- 左减的数字有限制,仅限于I、X、C。比如45不可以写成VL,只能是XLV
- 但是,左减时不可跨越一个位值。比如,99不可以用IC( {\displaystyle 100-1} 100-1)表示,而是用XCIX( {\displaystyle [100-10]+[10-1]} [100-10]+[10-1])表示。(等同于阿拉伯数字每位数字分别表示。)
- 左减数字必须为一位,比如8写成VIII,而非IIX。
- 右加数字不可连续超过三位,比如14写成XIV,而非XIIII。(见下方“数码限制”一项。)
- 加线乘千:
- 在罗马数字的上方加上一条横线或者加上下标的Ⅿ,表示将这个数乘以1000,即是原数的1000倍。
- 同理,如果上方有两条横线,即是原数的1000000( {\displaystyle 1000^{2}} 1000^{{2}})倍。
- 数码限制:
- 同一数码最多只能连续出现三次,如40不可表示为XXXX,而要表示为XL。
- 例外:由于IV是古罗马神话主神朱庇特(即IVPITER,古罗马字母里没有J和U)的首字,因此有时用IIII代替IV。
罗马数字 | 数值 | 拉丁语 |
---|---|---|
I | 1 | unus |
II | 2 | duo |
III | 3 | tres |
IV | 4 | quattuor |
V | 5 | quinque |
VI | 6 | sex |
VII | 7 | septem |
VIII | 8 | octo |
IX | 9 | novem |
X | 10 | decem |
XI | 11 | undecim |
XII | 12 | duodecim |
XIII | 13 | tresdecim |
XIV | 14 | quattuordecim |
XV | 15 | quindecim |
XVI | 16 | sedecim |
XVII | 17 | septendecim |
XVIII | 18 | duodeviginti |
XIX | 19 | undeviginti |
XX | 20 | viginti |
XXX | 30 | triginta |
XL | 40 | quadraginta |
L | 50 | quinquaginta |
LX | 60 | sexaginta |
LXX | 70 | septuaginta |
LXXX | 80 | octoginta |
XC | 90 | nonaginta |
XCIX | 99 | nonaginta novem |
C | 100 | centum |
CI | 101 | centum et unus |
CII | 102 | cij |
CXCIX | 199 | centum nonaginta novem |
CC | 200 | ducenti |
CCC | 300 | trecenti |
CD | 400 | quadringenta |
D | 500 | quincenti |
DC | 600 | sexcenta |
DCCC | 800 | octingenti |
CM | 900 | nongentos |
LeetCode提交源码:
public String intToRoman(int num){
if(num <= 0 || num >3999){
return null;
}
final int radix[] = {1000,900,500,400,100,90,50,40,
10,9,5,4,1};
final String symbol[] = {"M","CM","D","CD","C","XC","L","XL",
"X","IX","V","IV","I"};
StringBuilder roman = new StringBuilder();
for(int i = 0; num > 0; ++i){
int count = num/radix[i];
num %= radix[i];
for(;count > 0; --count)
roman.append(symbol[i]);
}
return roman.toString();
}
完整运行程序:
/**************************************************************
* Copyright (c) 2016
* All rights reserved.
* 版 本 号:v1.0
* 题目描述: Integer to Roman
* Given an integer, convert it to a roman numeral.
* Input is guaranteed to be within the range from 1 to 3999.
* Subscribe to see which companies asked this question
* 输入描述:请输入1---3999的数字:
* 3333
* 程序输出:转化成的罗马数字为:
* MMMCCCXXXIII
* 问题分析:无
* 算法描述:直接用表对应的数字输出即可
* 完成时间:2016-11-27
***************************************************************/
package org.GuoGuoFighting.LeetCode012;
import java.util.Scanner;
class SolutionMethod1{
public String intToRoman(int num){
if(num <= 0 || num >3999){
return null;
}
final int radix[] = {1000,900,500,400,100,90,50,40,
10,9,5,4,1};
final String symbol[] = {"M","CM","D","CD","C","XC","L","XL",
"X","IX","V","IV","I"};
StringBuilder roman = new StringBuilder();
for(int i = 0; num > 0; ++i){
int count = num/radix[i];
num %= radix[i];
for(;count > 0; --count)
roman.append(symbol[i]);
}
return roman.toString();
}
}
public class IntegertoRoman {
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
System.out.println("请输入1---3999的数字:");
int num = scanner.nextInt();
scanner.close();
System.out.println("转化成的罗马数字为:");
SolutionMethod1 solution1 = new SolutionMethod1();
System.out.println(solution1.intToRoman(num));
}
}
程序运行结果: