罗马数字逆向解法
题目:输入一个1到4000不包含4000的整数转换成罗马数字
代码如下(示例):
package com.hzc.bluecap;
import java.util.Scanner;
public class RomanNumReverse {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个[1——4000)的数整数");
int num=sc.nextInt();
System.out.println(RomanNum(num));
}
private static String RomanNum(int num) {
// TODO Auto-generated method stub
int m=num/1000;
int c=num%1000/100;
int x=num%100/10;
int a=num%10;
String s="";
if(0<num&&num<4000) {
if(m==1) s+="M";
if(m==2) s+="MM";
if(m==3) s+="MMM";
if(c==1) s+="C";
if(c==2) s+="CC";
if(c==3) s+="CCC";
if(c==4) s+="CD";
if(c==5) s+="D";
if(c==6) s+="DC";
if(c==7) s+="DCC";
if(c==8) s+="DCCC";
if(c==9) s+="CM";
if(x==1) s+="X";
if(x==2) s+="XX";
if(x==3) s+="XXX";
if(x==4) s+="XL";
if(x==5) s+="L";
if(x==6) s+="LX";
if(x==7) s+="LXX";
if(x==8) s+="LXXX";
if(x==9) s+="XC";
if(a==1) s+="I";
if(a==2) s+="II";
if(a==3) s+="III";
if(a==4) s+="IV";
if(a==5) s+="V";
if(a==6) s+="VI";
if(a==7) s+="VII";
if(a==8) s+="VIII";
if(a==9) s+="IX";
return s;
}
return "输入范围有误";
}
}
思路
我看到题目的第一想法是直接用数组下标表示数值数组存入罗马数值然后经过挣扎发现很难实现于是去B站看原视频发现暴力破解这一好方法,原视频链接: https://www.bilibili.com/video/BV1tt41177mu?p=6.
不想看视频的话下面我把我的想法分步讲解
一.1到3999直接用罗马数字全表示的话实现起来相当困难所以可以逐步分解
再进行配对(罗马数字规则I(1)、V(5)、X(10)、L(50)、C(100)、D(500)、 M(1000))根据将输入数值num除1000可得到千位
同理:num%1000/100可得到百位,num%100/10可得到十位,num/10可得到个位
二.用罗马数字分别表示不同位值1-9例如:千位可表示为M,MM,MMM
百位可表示为C,CC,CCC,CD,D,DC,DCC,DCCC,CM,十位,个位同理
三.创建一个字符串s储存结果在确认输入合法后用判断语句进行对比并进行拼接然后返回s
总结
对于可列举的有限结果题目用合理的暴力破解的办法一般可节约提高效率并减小难度