LeetCode12:Integer to Roman

原题目:
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提交源码:

   
   
  1. public String intToRoman(int num){
  2. if(num <= 0 || num >3999){
  3. return null;
  4. }
  5. final int radix[] = {1000,900,500,400,100,90,50,40,
  6. 10,9,5,4,1};
  7. final String symbol[] = {"M","CM","D","CD","C","XC","L","XL",
  8. "X","IX","V","IV","I"};
  9. StringBuilder roman = new StringBuilder();
  10. for(int i = 0; num > 0; ++i){
  11. int count = num/radix[i];
  12. num %= radix[i];
  13. for(;count > 0; --count)
  14. roman.append(symbol[i]);
  15. }
  16. return roman.toString();
  17. }

 
完整运行程序:

    
    
  1. /**************************************************************
  2. * Copyright (c) 2016
  3. * All rights reserved.
  4. * 版 本 号:v1.0
  5. * 题目描述: Integer to Roman
  6. * Given an integer, convert it to a roman numeral.
  7. * Input is guaranteed to be within the range from 1 to 3999.
  8. * Subscribe to see which companies asked this question
  9. * 输入描述:请输入1---3999的数字:
  10. * 3333
  11. * 程序输出:转化成的罗马数字为:
  12. * MMMCCCXXXIII
  13. * 问题分析:无
  14. * 算法描述:直接用表对应的数字输出即可
  15. * 完成时间:2016-11-27
  16. ***************************************************************/
  17. package org.GuoGuoFighting.LeetCode012;
  18. import java.util.Scanner;
  19. class SolutionMethod1{
  20. public String intToRoman(int num){
  21. if(num <= 0 || num >3999){
  22. return null;
  23. }
  24. final int radix[] = {1000,900,500,400,100,90,50,40,
  25. 10,9,5,4,1};
  26. final String symbol[] = {"M","CM","D","CD","C","XC","L","XL",
  27. "X","IX","V","IV","I"};
  28. StringBuilder roman = new StringBuilder();
  29. for(int i = 0; num > 0; ++i){
  30. int count = num/radix[i];
  31. num %= radix[i];
  32. for(;count > 0; --count)
  33. roman.append(symbol[i]);
  34. }
  35. return roman.toString();
  36. }
  37. }
  38. public class IntegertoRoman {
  39. public static void main(String[] args){
  40. Scanner scanner = new Scanner(System.in);
  41. System.out.println("请输入1---3999的数字:");
  42. int num = scanner.nextInt();
  43. scanner.close();
  44. System.out.println("转化成的罗马数字为:");
  45. SolutionMethod1 solution1 = new SolutionMethod1();
  46. System.out.println(solution1.intToRoman(num));
  47. }
  48. }


程序运行结果:
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值