匪警请拨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)方法
为了保障社会秩序,保护人民群众生命财产安全,警察叔叔需要与罪犯斗智斗勇,因而需要经常性地进行体力训练和智力训练!
某批警察叔叔正在进行智力训练:
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;
}
}