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);
}
}
}