警察叔叔智力训练计算1 2 3 4 5 6 7 8 9=110;JAVA实现的两种方式
2012-12-08 21:47
477 查看
匪警请拨110,即使手机欠费也可拨通!
为了保障社会秩序,保护人民群众生命财产安全,警察叔叔需要与罪犯斗智斗勇,因而需要经常性地进行体力训练和智力训练!
某批警察叔叔正在进行智力训练:
1 2 3 4 5 6 7 8 9=110;
请看上边的算式,为了使等式成立,需要在数字间填入加号或者减号(可以不填,但不能填入其它符号)。之间没有填入符号的数字组合成
一个数,例如:12+34+56+7-8+9?就是一种合格的填法;123+4+5+67-89?是另一个可能的答案。
请你利用计算机的优势,帮助警察叔叔快速找到所有答案。
每个答案占一行。形如:
12+34+56+7-8+9
123+4+5+67-89
......
方式一思想:
1.设一个长度为17的字符数组,char[] end=new char[]{'1',' ','2',' ','3',' ','4',' ','5',' ','6',' ','7',' ','8',' ','9'};
2.向其中的空串位置添加三种字符‘+’,‘-’,‘ ’。把所有的情况存进一个数组中,数组的每一个成员为长度为8把的字符串
3.所有可能的数组从char[]{' ','+','-'}开始,做7次循环遍历操作,将单个字符串变成长度为8的字符串。下面的doFor方法,数组为下面的ary
4.将ary填充进end,每填充一种可能就检查是否满足,满足便输出
5.检查的方法是将字符数组变成字符串,切分出数字和运算符,见check(char[] end)方法
方式二思想:简化方式一中的形式,所有的可能和长度为8的3进制的数所有组合相同,按三进制的0,1,2选择向基准字符串插入‘+’、‘-’或不插入
为了保障社会秩序,保护人民群众生命财产安全,警察叔叔需要与罪犯斗智斗勇,因而需要经常性地进行体力训练和智力训练!
某批警察叔叔正在进行智力训练:
1 2 3 4 5 6 7 8 9=110;
请看上边的算式,为了使等式成立,需要在数字间填入加号或者减号(可以不填,但不能填入其它符号)。之间没有填入符号的数字组合成
一个数,例如:12+34+56+7-8+9?就是一种合格的填法;123+4+5+67-89?是另一个可能的答案。
请你利用计算机的优势,帮助警察叔叔快速找到所有答案。
每个答案占一行。形如:
12+34+56+7-8+9
123+4+5+67-89
......
方式一思想:
1.设一个长度为17的字符数组,char[] end=new char[]{'1',' ','2',' ','3',' ','4',' ','5',' ','6',' ','7',' ','8',' ','9'};
2.向其中的空串位置添加三种字符‘+’,‘-’,‘ ’。把所有的情况存进一个数组中,数组的每一个成员为长度为8把的字符串
3.所有可能的数组从char[]{' ','+','-'}开始,做7次循环遍历操作,将单个字符串变成长度为8的字符串。下面的doFor方法,数组为下面的ary
4.将ary填充进end,每填充一种可能就检查是否满足,满足便输出
5.检查的方法是将字符数组变成字符串,切分出数字和运算符,见check(char[] end)方法
方式二思想:简化方式一中的形式,所有的可能和长度为8的3进制的数所有组合相同,按三进制的0,1,2选择向基准字符串插入‘+’、‘-’或不插入
方式一: package test; /** * 123456789=110 * @author sun */ public class Test03 { //1 定义运算符基本数组 public static char[] c=new char[]{' ','+','-'}; public static void main(String[] args) { //2 定义一个StringBuffer数组对象,用于存储操作符组合 StringBuffer[] ary=new StringBuffer[c.length]; //3 填充该StringBuffer对象第一层 for (int i = 0; i < ary.length; i++) { ary[i]=new StringBuffer(); ary[i].append(c[i]); } //4 循环填充7次 for (int i = 0; i < 7; i++) { ary=doFor(c,ary);//抽取填充方法 } //5 定义基本运算字符数组 char[] end=new char[]{'1',' ','2',' ','3',' ','4',' ','5',' ','6',' ','7',' ','8',' ','9'}; //6 外层循环遍历操作符数组,并检查是否符合要求 for (int i = 0; i < ary.length; i++){ //7 内层循环填充运算符数组 for (int j=0; j < ary[i].length();j++) { end[j*2+1]=ary[i].toString().charAt(j); } //8 检查填充完毕后的字符数组是否符合要求,如果符合便输出 if(check(end)){//抽取检查方法 System.out.println(charsToString(end));//抽取打印方法 } } } //将char数组转为StringBuffer对象并删除其中的空格 private static StringBuffer charsToString(char[] end) { //1 先将char[]数组转为一个StringBuffer对象 StringBuffer str=new StringBuffer(new String(end)); //Stringy的构造函数接受一个字符数字,将其序列变为String对象 //2 去除其中的空格 //方法为遍历str每一位当该位为空格是调用deleteCharAt(i)方法删除 for (int i = 0; i < str.length(); i++) { if(str.charAt(i)==' '){ str.deleteCharAt(i);//StringBuffer对字符串对象变更的便利 } } //3 返回该StringBuffer对象 return str; } //检查指定数组是否符合要求 private static boolean check(char[] end) { //1 讲字符串数组变为StringBuffer对象便于操作 StringBuffer str = charsToString(end); //利用String字符串匹配正则表达式的方法拆分成运算数数组和操作符数组 String[] c1=str.toString().split("[+-]");//运算数数组 String[] c2=str.toString().split("[1-9]");//操作符数组 注意,此处长度为9 int sum=Integer.parseInt(c1[0]);//定义求和数sum,并赋予第一个运算数的值 //此处遍历运算符数组,取出其中为“+”或“-”的运算符,忽略空格,并与该运算符后面的运算数作运算 for (int i=0,j=1;i<c2.length;i++){ if(c2[i].equals("+")){ sum+=Integer.parseInt(c1[j++]); } if(c2[i].equals("-")){ sum-=Integer.parseInt(c1[j++]); } } //如果求和数sum值为110,返回true,否则返回false if(sum==110) return true; return false; } //返回 将 指定字符串 后面添加 指定字符串数组中的成员 的所有结果 private static StringBuffer[] doFor(char[] c2, StringBuffer[] ary) { //定义返回结果的字符串数组,长度为:“待添加字符串数组长度”*“指定字符串数组” StringBuffer[] str=new StringBuffer[c2.length*ary.length]; int x=0;//用于顺利填充 //双层循环填充 //第一层遍历待填充字符串 for (int i = 0; i < ary.length; i++) { //第二层遍历追求的指定字符串数组 for (int j = 0; j < c2.length;j++) { //利用StringBuffer的append方法添加 str[x++]=new StringBuffer(ary[i]).append(c2[j]); //ary[i].append(c2[j]);不可以,因为声明了但没在内存中产生 } } return str; } } 方式二: package test; /** * 123456789=110 * @author sun */ public class Test06 { public static void main(String[] args){ //基准字符数组 char[] num=new char[]{'1','2','3','4','5','6','7','8','9'}; //初始化第一个字符 StringBuffer str=new StringBuffer().append(num[0]); //所有种可能3的8次方 int sum=(int)Math.pow(3, 8); for (int i = 1; i < sum; i++) { //1 将i用3进制表示 StringBuffer three=new StringBuffer(Integer.toString(i,3)); //如果长度不够,前面补零 if(three.length()<8){ for (int k = three.length(); k <8; k++) { three.insert(0, "0"); } } //2遍历添加8次运算符和数字 for (int j = 0; j < 8; j++) { if(three.charAt(j)=='1') str.append("+"); if(three.charAt(j)=='2') str.append("-"); /* switch (three.charAt(j)) { case '0': break; case '1': str.append("+"); break; case '2': str.append("-"); break; }*/ str.append(num[j+1]); } //3 检查是否符合要求 if(check(str)){ System.out.println(str); } //4 讲字符串恢复原始长度1 str.setLength(1); } } private static boolean check(StringBuffer str) { String[] c1=str.toString().split("[+-]"); String[] c2=str.toString().split("[1-9]"); int sum=Integer.parseInt(c1[0]); for (int i=0,j=1;i<c2.length;i++){ if(c2[i].equals("+")){ sum+=Integer.parseInt(c1[j++]); } if(c2[i].equals("-")){ sum-=Integer.parseInt(c1[j++]); } } if(sum==110) return true; return false; } }
相关文章推荐
- 黑马程序员 Java中根据YYYY-MM-DD格式的日期计算为星期几的两种实现方式
- 110警察叔叔训练智力
- 匪警请拨110,即使手机欠费也可拨通! 为了保障社会秩序,保护人民群众生命财产安全,警察叔叔需要与罪犯斗智斗勇,因而需要经常性地进行体力训练和智力训练!某批警察叔叔正在进行智力训练:1 2 3 4
- Java中有两种实现多线程的方式以及两种方式之间的区别
- java中多线程的实现方式有两种
- Java实现多线程的两种方式
- Java实现多线程的两种方式
- java的两种线程实现方式
- Java多线程(二):常用的实现多线程的两种方式
- java实现深拷贝的两种方式及效率比较
- Java中三种代理方式—— 静态代理与两种动态代理的实现机制
- Java学习(九):Java线程的两种实现方式
- java多线程两种实现方式
- 杨辉三角(Pascal三角)java实现的两种方式
- Java中有两种实现多线程的方式以及两种方式之间的区别
- java实现文件下载的两种方式
- java实现MQ消息收发两种方式
- java中匿名内部类的两种实现方式 (引用)
- Java实现AOP的两种方式
- Spark中RDD转换成DataFrame的两种方式(分别用Java和scala实现)