暴力拆解:当我们需要进行一些分析时比较麻烦,而且进行枚举时候发现,需要进行枚举的数量比较小,这个时候我们通过暴力拆解比较快捷方便。
(1)罗马数字转换
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。
字符 数值
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。
通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:
I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。
C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。
给定一个罗马数字,将其转换成整数。输入确保在 1 到 3999 的范围内。
示例 1:
输入: “III”
输出: 3
示例 2:
输入: “IV”
输出: 4
示例 3:
输入: “IX”
输出: 9
示例 4:
输入: “LVIII”
输出: 58
解释: L = 50, V= 5, III = 3.
示例 5:
输入: “MCMXCIV”
输出: 1994
解释: M = 1000, CM = 900, XC = 90, IV = 4.
public class RommaNumber {
private static int RommaNumber(String s) {
// I 1
// V 5
// X 10
// L 50
// C 100
// D 500
// M 1000
// MCMXCIV == 1994
int sum=0;
for (int i = 0; i < s.length(); i++) {
// 取出s中的字符
char std = s.charAt(i);
// 进行枚举判断
if(std=='I') sum +=1;
if(std=='V') sum +=5;
if(std=='X') sum +=10;
if(std=='L') sum +=50;
if(std=='C') sum +=100;
if(std=='D') sum +=500;
if(std=='M') sum +=1000;
}
// 进行补偿
// IV时,sum加的为6,实际为4,因此需要进行补偿
if(s.indexOf("IV")>=0) sum -=2;
if(s.indexOf("IX")>=0) sum -=2;
if(s.indexOf("XL")>=0) sum -=20;
if(s.indexOf("XC")>=0) sum -=20;
if(s.indexOf("CD")>=0) sum -=200;
if(s.indexOf("CM")>=0) sum -=200;
return sum;
}
public static void main(String[] args) {
//罗马转换数字
System.out.print(RommaNumber("MCMXCIV"));
}
}
(2)数字转罗马
public class NumberRomma {
private static String NumberRomma(int i) {
String s="";
// 进行数字拆解
int a=i/1000;//千位
int b=i%1000/100;//百位
int c=i%1000%100/10;//十位
int d=i%1000%100%10;//个位
// 进行对比,枚举
// 千位
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;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
// 输入数字转化罗马
// 1994=MCMXCIV
System.out.println(NumberRomma(1994));
System.out.println(NumberRomma(999));
System.out.println(NumberRomma(98));
System.out.println(NumberRomma(9));
}
}
(3)年龄猜数字
美国数学家维纳(N.Wiener)智力早熟,11岁就上了大学。他曾在1935~1936年应邀来中国清华大学讲学。一次,他参加某个重要会议,年轻的脸孔引人注目。于是有人询问他的年龄,他回答说:“我年龄的立方是个4位数。我年龄的4次方是个6位数。这10个数字正好包含了从0到9这10个数字,每个都恰好出现1次。”请你推算一下,他当时到底有多年轻。
public class AgeForNumber {
public static void main(String[] args) {
Boolean flag=true;
int age=0;
for (int i = 0; i < 100; i++) {
int a = i*i*i;//立方条件
if (a>1000&&a<10000) {
int b =a*i;//4次方条件
if (b>100000&&b<1000000) {
String A = a + "";
String B = b + "";
String AB =A+B;
for (int j = 0; j < 10; j++) {
String J =j+"";
if(AB.indexOf(J)<0) flag=false;
}
if(flag==true) {
System.out.print("年龄为:"+i);
}
}
}
}
}
}
(4)九宫幻方:
小明最近在教邻居家的小朋友小学奥数,而最近正好讲述到了三阶幻方这个部分,三阶幻方指的是将1~9不重复的填入一个3*3的矩阵当中,使得每一行、每一列和每一条对角线的和都是相同的。
三阶幻方又被称作九宫格,在小学奥数里有一句非常有名的口诀:“二四为肩,六八为足,左三右七,戴九履一,五居其中”,通过这样的一句口诀就能够非常完美的构造出一个九宫格来。
有意思的是,所有的三阶幻方,都可以通过这样一个九宫格进行若干镜像和旋转操作之后得到。现在小明准备将一个三阶幻方(不一定是上图中的那个)中的一些数抹掉,交给邻居家的小朋友来进行还原,并且希望她能够判断出究竟是不是只有一个解。而你呢,也被小明交付了同样的任务,但是不同的是,你需要写一个程序~
输入格式:
一个 3×3 的矩阵,其中为 0 的部分表示被小明抹去的部分。数据保证给出的矩阵至少能还原出一组可行的三阶幻方。
输出格式:
如果仅能还原出一组可行的三阶幻方,则将其输出,否则输出 "Too Many"。
输入样例:
0 7 2
0 5 0
0 3 0
输出样例:
6 7 2
1 5 9
8 3 4
public class MagicSquareoftheNinePalaces {
//九宫幻方
static Boolean Math(String ss ,String s) {
// 直接进行对比
for (int i = 0; i < ss.length(); i++) {
if (ss.charAt(i)==s.charAt(i)) continue;
if (s.charAt(i)=='0') continue;
//System.out.println(i);
return false;
}
return true;
}
public static void main(String[] args) {
// 4 9 2
// 3 5 7
// 8 1 6
// 进行枚举
// 0 7 2
// 0 5 0
// 0 3 0
String s="072050030";
int count=0;
ArrayList<String> sss=new ArrayList<String>();
String[] ss= {
"492357816",
"834159673",
"618753294",
"276951438",
"294753618",
"672159834",
"816357492",
"438951276"
};
for (int i = 0; i < ss.length; i++) {
if (Math(ss[i],s)) {
sss.add(ss[i]);
count++;
}
}
if (count==1) {
for (String a:sss) {
System.out.println(a.substring(0,3));
System.out.println(a.substring(3,6));
System.out.println(a.substring(6,9));
}
}else {
System.out.print("Too Many");
}
}
}