警察叔叔智力训练计算1 2 3 4 5 6 7 8 9=110;JAVA实现的两种方式

匪警请拨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选择向基准字符串插入‘+’、‘-’或不插入




方式一:
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;
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值