暴力破解与实用性优先(罗马数字)
2018-03-06 17:28
169 查看
题目描述:
古罗马帝国开创了辉煌的人类文明,但他们的数字表示法的确有些繁琐,尤其在表示大数的时候,现在看起来简直不能忍受,所以在现代很少使用了。之所以这样,不是因为发明表示法的人的智力的问题,而是因为一个宗教的原因,当时的宗教禁止在数字中出现0的概念!
单个符号重复多少次,就表示多少倍。最多重复3次。比如:CCC表示300 XX表示20,但150并不用LLL表示,这个规则仅适用于I X C M。
如果相邻级别的大单位在右,小单位在左,表示大单位中扣除小单位。比如:IX表示9 IV表示4 XL表示40 更多的示例参见下表,你找到规律了吗?
I,1
II,2
III,3
IV,4
V,5
VI,6
VII,7
VIII,8
IX,9
X,10
XI,11
XII,12
XIII,13
XIV,14
XV,15
XVI,16
XVII,17
XVIII,18
XIX,19
XX,20
XXI,21
XXII,22
XXIX,29
XXX,30
XXXIV,34
XXXV,35
XXXIX,39
XL,40
L,50
LI,51
LV,55
LX,60
LXV,65
LXXX,80
XC,90
XCIII,93
XCV,95
XCVIII,98
XCIX,99
C,100
CC,200
CCC,300
CD,400
D,500
DC,600
DCC,700
DCCC,800
CM,900
CMXCIX,999
本题目的要求是:请编写程序,由用户输入若干个罗马数字串,程序输出对应的十进制表示。
输入格式是:第一行是整数n,表示接下来有n个罗马数字(n<100)。以后每行一个罗马数字。罗马数字大小不超过999。
要求程序输出n行,就是罗马数字对应的十进制数据。
例如,用户输入:
则程序应该输出:
方法一(枚举算法):
规则:
代码如下:
方法二:将数字1-4000转换成罗马字母,然后将主程序中给出的字符串与这些数字所对应的罗马字母进行比较,当比较成功时,则将该数字输出出来。
代码如下:
古罗马帝国开创了辉煌的人类文明,但他们的数字表示法的确有些繁琐,尤其在表示大数的时候,现在看起来简直不能忍受,所以在现代很少使用了。之所以这样,不是因为发明表示法的人的智力的问题,而是因为一个宗教的原因,当时的宗教禁止在数字中出现0的概念!
罗马数字的表示主要依赖以下几个基本符号: I 1 V 5 X 10 L 50 C 100 D 500 M 1000 这里,我们只介绍一下1000以内的数字的表示法。
单个符号重复多少次,就表示多少倍。最多重复3次。比如:CCC表示300 XX表示20,但150并不用LLL表示,这个规则仅适用于I X C M。
如果相邻级别的大单位在右,小单位在左,表示大单位中扣除小单位。比如:IX表示9 IV表示4 XL表示40 更多的示例参见下表,你找到规律了吗?
I,1
II,2
III,3
IV,4
V,5
VI,6
VII,7
VIII,8
IX,9
X,10
XI,11
XII,12
XIII,13
XIV,14
XV,15
XVI,16
XVII,17
XVIII,18
XIX,19
XX,20
XXI,21
XXII,22
XXIX,29
XXX,30
XXXIV,34
XXXV,35
XXXIX,39
XL,40
L,50
LI,51
LV,55
LX,60
LXV,65
LXXX,80
XC,90
XCIII,93
XCV,95
XCVIII,98
XCIX,99
C,100
CC,200
CCC,300
CD,400
D,500
DC,600
DCC,700
DCCC,800
CM,900
CMXCIX,999
本题目的要求是:请编写程序,由用户输入若干个罗马数字串,程序输出对应的十进制表示。
输入格式是:第一行是整数n,表示接下来有n个罗马数字(n<100)。以后每行一个罗马数字。罗马数字大小不超过999。
要求程序输出n行,就是罗马数字对应的十进制数据。
例如,用户输入:
3 LXXX XCIII DCCII
则程序应该输出:
80 93 702
方法一(枚举算法):
规则:
代码如下:
package sf_04; public class Main { //罗马数字的枚举算法 public static int romeNum(Str 4000 ing s){ //I V X L C D M //1 5 10 50 100 500 1000 /* * 由于情况太少,可以在其中进行枚举。 */ int sum=0; for(int i=0;i<s.length();i++){ char c=s.charAt(i); if(c=='I') sum+=1; if(c=='V') sum+=5; if(c=='X') sum+=10; if(c=='L') sum+=50; if(c=='C') sum+=100; if(c=='D') sum+=500; if(c=='M') sum+=1000; } /* * 先按照统一的规则进行计算。 * 随后进行补偿即可。 */ //在s中存在IV这个组合。 if(s.indexOf("IV")>=0) sum-=2; //IV代表4 但是在计算的时候,结果为6,应减去2. if(s.indexOf("IX")>=0) sum-=2; //IX代表9 但是在计算的时候,结果为11,应减去2. if(s.indexOf("XL")>=0) sum-=20; //XL代表40 但是在计算的时候,结果为60,应减去20. if(s.indexOf("XC")>=0) sum-=20; //XC代表90 但是在计算的时候,结果为110,应减去20. if(s.indexOf("CD")>=0) sum-=200; //CD代表400 但是在计算的时候,结果为600,应减去200. if(s.indexOf("CM")>=0) sum-=200; //CM代表900 但是在计算的时候,结果为1100,应减去200. return sum; } public static void main(String[] args) { /* * 仅使用了一个测试用例。 */ System.out.print(romeNum("MCCCXIV"));//1314 } }
方法二:将数字1-4000转换成罗马字母,然后将主程序中给出的字符串与这些数字所对应的罗马字母进行比较,当比较成功时,则将该数字输出出来。
代码如下:
package sf_05; public class Main { /* * 将数字转换成罗马字母。 */ public static int ss; static String NumRoman(int x){ /* * 2 4 9 * 2代表200,4代表40,9代表9 */ //I V X L C D M //1 5 10 50 100 500 1000 /* * 如果情况很少时,找规律是很不合算的。 */ int a=x/1000;//千位 int b=x%1000/100;//百位 int c=x%100/10;//十位 int d=x%10;//个位 String s=""; if(a==1) s+="M"; if(a==2) s+="MM"; if(a==3) s+="MMM"; if(b==1) s+="C"; if(b==2) s+="CC"; if(b==3) s+="CCC"; if(b==4) s+="CD"; if(b==5) s+="D"; if(b==6) s+="DC"; if(b==7) s+="DCC"; if(b==8) s+="DCCC"; if(b==9) s+="CM"; if(c==1) s+="X"; if(c==2) s+="XX"; if(c==3) s+="XXX"; if(c==4) s+="XL"; if(c==5) s+="L"; if(c==6) s+="LX"; if(c==7) s+="LXX"; if(c==8) s+="LXXX"; if(c==9) s+="XC"; if(d==1) s+="I"; if(d==2) s+="II"; if(d==3) s+="III"; if(d==4) s+="IV"; if(d==5) s+="V"; if(d==6) s+="VI"; if(d==7) s+="VII"; if(d==8) s+="VIII"; if(d==9) s+="IX"; return s; } static boolean RomanNumOK(String s){ //0-4000中所有的数字都转成罗马数字,与所给的字符进行比较。 for(int i=0;i<4000;i++){ if(s.equals(NumRoman(i))){ ss=i; return true; } } return false; } public static void main(String[] args) { // TODO Auto-generated method stub if(RomanNumOK("CCXLIX")){ System.out.print(ss); } //System.out.println(NumRoman(3249)); //System.out.println(NumRoman(3009)); } }
相关文章推荐
- 暴力破解与实用性优先(年龄谜题、九宫幻方)
- 蓝桥杯算法特训 | C++ | 暴力破解与实用性优先
- 一 . 暴力破解与实用性优先
- (蓝桥杯第一课)暴力破解与实用性优先
- 1、暴力破解与实用性原则
- 暴力破解练习(二)罗马数字
- Jvisualvm 对 暴力破解 进行性能优化
- Linux下暴力破解工具Hydra详解
- 利用Teensy进行EM410x卡模拟以及暴力破解EM410X类门禁系统可行性猜想
- aircrack-ng暴力破解无线密码攻略
- 用shell防止邮件暴力破解 推荐
- [置顶] 自动截取root密码和防暴力破解sshd密码
- linux服务篇-sshd服务管理与防止暴力破解
- 部署fail2ban防止暴力破解ssh密码
- Python暴力破解zip密码
- 暴力破解目录和文件位置
- python暴力破解zip密码文件
- ssh访问控制,多次失败登录即封掉IP,防止暴力破解
- Centos 7安装Fail2ban防御暴力破解密码(配合FirewallD)
- 安全科普:什么是暴力破解攻击?如何检测和防御?