Integer to Roman leetcode java

题目

Given an integer, convert it to a roman numeral.

Input is guaranteed to be within the range from 1 to 3999.

 

题解

这道题。。还有哪个roman to integer。。第一件事 就是先把roman认全吧。。

 

 罗马数字拼写规则(转自Wikipedia:http://zh.wikipedia.org/wiki/%E7%BD%97%E9%A9%AC%E6%95%B0%E5%AD%97):

羅馬數字共有7個,即I(1)、V(5)、X(10)、L(50)、C(100)、D(500)和M(1000)。按照下述的規則可以表示任意正整數。需要注意的是罗马数字中没有“0”,與進位制無關。一般認為羅馬數字只用來記數,而不作演算。

  • 重複數次:一個羅馬數字重複幾次,就表示這個數的幾倍。
  • 右加左減:
    • 在較大的羅馬數字的右邊記上較小的羅馬數字,表示大數字加小數字。
    • 在較大的羅馬數字的左邊記上較小的羅馬數字,表示大數字减小數字。
    • 左减的数字有限制,仅限于I、X、C。比如45不可以写成VL,只能是XLV
    • 但是,左減時不可跨越一個位數。比如,99不可以用IC(100 - 1)表示,而是用XCIX([100 - 10] + [10 - 1])表示。(等同於阿拉伯數字每位數字分別表示。)
    • 左減數字必須為一位,比如8寫成VIII,而非IIX。
    • 右加數字不可連續超過三位,比如14寫成XIV,而非XIIII。(見下方“數碼限制”一項。)
  • 加線乘千:
    • 在羅馬數字的上方加上一條橫線或者加上下標的Ⅿ,表示將這個數乘以1000,即是原數的1000倍。
    • 同理,如果上方有兩條橫線,即是原數的1000000(1000^{2})倍。
  • 數碼限制:
    • 同一數碼最多只能出現三次,如40不可表示為XXXX,而要表示為XL。
    • 例外:由於IV是古羅馬神話主神朱庇特(即IVPITER,古羅馬字母裡沒有J和U)的首字,因此有時用IIII代替IV。

 

 

根据上述规则,我们可以发现两条对解这道题有帮助的内容:

  • 左减的数字有限制,仅限于I、X、C。比如45不可以写成VL,只能是XLV
  • 但是,左減時不可跨越一個位數。比如,99不可以用IC(100 - 1)表示,而是用XCIX([100 - 10] + [10 - 1])表示。(等同於阿拉伯數字每位數字分別表示。)
  • 左減數字必須為一位,比如8寫成VIII,而非IIX。

有以上三个内容我们可以发现在减数的时候有特定的规律,就是只能减1位且不能跨越一个位数,同时只限于I X C。

像上面那个例子,99 不能用IC(100-1)表示,是因为如果一个数字超过90(或等于90),其罗马数字的表示就必须包含一个XC(100-10)。

同理,对I X C都适用这个原则。

这个判断,要从最大往下找,如果一个数字是5,那么他就是属于大于等于5,罗马数字包含V,而无需写成IIIII。

所以,递归的,代码可以写成如下(代码源自leetcode discussion):

 

 1      public String intToRoman( int num) {
 2          if(num>=1000)  return "M"+intToRoman(num-1000);
 3          if(num>=900)  return "CM"+intToRoman(num-900);
 4          if(num>=500)  return "D"+intToRoman(num-500);
 5          if(num>=400)  return "CD"+intToRoman(num-400);
 6          if(num>=100)  return "C"+intToRoman(num-100);
 7          if(num>=90)  return "XC"+intToRoman(num-90);
 8          if(num>=50)  return "L"+intToRoman(num-50);
 9          if(num>=40)  return "XL"+intToRoman(num-40);
10          if(num>=10)  return "X"+intToRoman(num-10);
11          if(num>=9)  return "IX"+intToRoman(num-9);
12          if(num>=5)  return "V"+intToRoman(num-5);
13          if(num>=4)  return "IV"+intToRoman(num-4);
14          if(num>=1)  return "I"+intToRoman(num-1);
15          return "";
16     }

 非递归的写法如下,道理一样:

 1      public String intToRoman( int num) {
 2         String str = "";    
 3         String [] symbol = {"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};    
 4          int [] value = {1000,900,500,400, 100, 90,  50, 40,  10, 9,   5,  4,   1};   
 5          for( int i=0;num!=0;i++){  
 6              while(num >= value[i]){  
 7                 num -= value[i];  
 8                 str += symbol[i];  
 9             }  
10         }  
11          return str;  
12     }

 

 Reference:http://blog.csdn.net/havenoidea/article/details/11848921

转载于:https://www.cnblogs.com/springfor/p/3886459.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
城市应急指挥系统是智慧城市建设的重要组成部分,旨在提高城市对突发事件的预防和处置能力。系统背景源于自然灾害和事故灾难频发,如汶川地震和日本大地震等,这些事件造成了巨大的人员伤亡和财产损失。随着城市化进程的加快,应急信息化建设面临信息资源分散、管理标准不统一等问题,需要通过统筹管理和技术创新来解决。 系统的设计思路是通过先进的技术手段,如物联网、射频识别、卫星定位等,构建一个具有强大信息感知和通信能力的网络和平台。这将促进不同部门和层次之间的信息共享、交流和整合,提高城市资源的利用效率,满足城市对各种信息的获取和使用需求。在“十二五”期间,应急信息化工作将依托这些技术,实现动态监控、风险管理、预警以及统一指挥调度。 应急指挥系统的建设目标是实现快速有效的应对各种突发事件,保障人民生命财产安全,减少社会危害和经济损失。系统将包括预测预警、模拟演练、辅助决策、态势分析等功能,以及应急值守、预案管理、GIS应用等基本应用。此外,还包括支撑平台的建设,如接警中心、视频会议、统一通信等基础设施。 系统的实施将涉及到应急网络建设、应急指挥、视频监控、卫星通信等多个方面。通过高度集成的系统,建立统一的信息接收和处理平台,实现多渠道接入和融合指挥调度。此外,还包括应急指挥中心基础平台建设、固定和移动应急指挥通信系统建设,以及应急队伍建设,确保能够迅速响应并有效处置各类突发事件。 项目的意义在于,它不仅是提升灾害监测预报水平和预警能力的重要科技支撑,也是实现预防和减轻重大灾害和事故损失的关键。通过实施城市应急指挥系统,可以加强社会管理和公共服务,构建和谐社会,为打造平安城市提供坚实的基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值