备考蓝桥杯(33)警察智力运算java实现

package pers.robert.lanqiaobeizhenti129;

/**
 * 42.警察智力训练 匪警请拨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+9123+4+5+67-89......
 * 已知的两个答案可以输出,但不计分。 各个答案的前后顺序不重要。
 * 
 * @author Robert
 *
 */
public class The042CallPoliceDemo1 {
	// 遍历所有情况
	public static void fun(String s) {
		char[] c = s.toCharArray();
		StringBuffer sb = new StringBuffer(); // 记录 组成的式子
		int len = s.length() - 1; // 字符串长度 - 1
		int[] sign = new int[len]; // sign用来标记符号, 最多有(s的长度-1)个符号
		// 从后身前添加符号
		while (sign[0] < 3) { // 最前面的判定符号的值若 >=3 则结束循环
			sb.append(c[0]); // 添加首元素
			for (int i = 0; i < len; i++) {
				if (sign[i] == 1) { // 值为1添加"+"号
					sb.append("+");
				} else if (sign[i] == 2) {// 值为2添加"-"号
					sb.append("-");
				}
				sb.append(c[i + 1]); // 不管添加不添加+-号,都添加后一个元素
			}

			check(sb.toString()); // 验证并输出

			sb.setLength(0); // 清空sb
			sign[len - 1]++; // 每循环一次,最后一个符号值加1
//System.out.println(len-1+":::::::::::"+sign[len-1]);
			for (int i = len - 1; i > 0; i--) { // 当值等于3时,实现逢3进位
				if (sign[i] == 3) {
					sign[i] = 0; // sign[i] 归零
					sign[i - 1]++; // sign[i-1]进位
				}
			}
		}
	}

	// 验证并输出
	public static void check(String str) {
		String[] s = str.split("[+,-]"); // 得到全部数字
		String sign = str.replaceAll("\\d*", ""); // 得到全部符号(+-)
		int sum = Integer.parseInt(s[0]); // 把第一个数字给sum
		for (int i = 0; i < s.length - 1; i++) {
			switch (sign.charAt(i)) {
			case '+':
				sum += Integer.parseInt(s[i + 1]);
				break;
			case '-':
				sum -= Integer.parseInt(s[i + 1]);
				break;
			}
		}
		if (sum == 110) { // 符合条件输出
			System.out.println(str);
		}
	}

	// 主函数
	public static void main(String[] args) {
		String s = "123456789";
		fun(s);
	}

}

方法二:

package pers.robert.lanqiaobeizhenti129;

/**
 * 42.警察智力训练 匪警请拨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+9123+4+5+67-89......
 * 已知的两个答案可以输出,但不计分。 各个答案的前后顺序不重要。
 * 
 * @author Robert
 *
 */
public class The042CallPoliceDemo2 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		// String string = "123+4+5+67-89";

		char a[] = { ' ', '+', '-' };
		char num[] = { '1', '2', '3', '4', '5', '6', '7', '8', '9' };
		for (char x1 : a)
			for (char x2 : a)
				for (char x3 : a)
					for (char x4 : a)
						for (char x5 : a)
							for (char x6 : a)
								for (char x7 : a)
									for (char x8 : a) {
										int result = 0;
										char s[] = { x1, x2, x3, x4, x5, x6, x7, x8 };
										String string = "";
										for (int i = 0; i <= 7; i++) {
											string = string + num[i] + s[i];
										}
										string = string + num[8];
										string = string.replaceAll(" ", "");
										String jianString[] = string.split("-");
										int addResult[] = new int[jianString.length];

										addResult[0] = 0;
										String addString[] = jianString[0].split("[+]");
										for (int j = 0; j < addString.length; j++) {
											addResult[0] += Integer.parseInt(String.valueOf(addString[j]));
										}
										result = addResult[0];
										for (int i = 1; i < jianString.length; i++) {
											String num1[] = jianString[i].split("[+]");
											result = result - Integer.parseInt(String.valueOf(num1[0]));
											for (int p = 1; p < num1.length; p++)
												result += Integer.parseInt(String.valueOf(num1[p]));
										}
										if (result == 110)
											System.out.println(string);
									}
	}

}







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值