package org.lw.test;
import java.util.ArrayList;
import java.util.List;
/**
* 1234567890中间加上+、-、*、/或者""后变成的等式结果为110
* @author 古市轩
* @时间 2012-4-28下午 07:41:22
*/
public class Test111 {
public static void main(String[] args) {
String str = "123456789";
output(str);
}
// 根据算式截取运算符
public static List<Character> getOperation(String str) {
if (!"".equals(str)) {
List<Character> list = new ArrayList<Character>();
for (int i = 0; i < str.length(); i++) {
if (str.charAt(i) == '+' || str.charAt(i) == '-'
|| str.charAt(i) == '*' || str.charAt(i) == '/') {
list.add(str.charAt(i));
}
}
return list;
} else {
return null;
}
}
// 根据算式截取操作数
public static List<Long> getOperationNumber(String str) {
if (!"".equals(str)) {
List<Long> list = new ArrayList<Long>();
String[] s = str.split("\\+|-|\\*|/|&|=|(>=)|(<=)");
for (int i = 0; i < s.length; i++) {
list.add(Long.parseLong(s[i]));
}
return list;
} else {
return null;
}
}
// 根据只有加减运算的等式计算结果
public static Long getResult(String str) {
Long result = -1L;
if (str.contains("+") || str.contains("-")) {
List<Character> operations = getOperation(str);
List<Long> operationNumbers = getOperationNumber(str);
result = operationNumbers.get(0);
for (int i = 0; i < operations.size(); i++) {
char ch = operations.get(i);
switch (ch) {
case '+':
result = result + operationNumbers.get(i + 1);
break;
case '-':
result = result - operationNumbers.get(i + 1);
}
}
}
return result;
}
// 把等式的乘除运算计算完后返回只剩加减运算的等式,即把含有乘法和除法的等式装换成只含有加法和减法的等式
public static String getAddAndSubString(String str) {
StringBuilder sb = new StringBuilder();
if (str.contains("*") || str.contains("/")) {
List<Character> operations = getOperation(str);
List<Long> operationNumbers = getOperationNumber(str);
for (int i = 0; i < operations.size(); i++) {
Long temp = 0L;
switch (operations.get(i)) {
case '*':
temp = operationNumbers.get(i);
temp = temp * operationNumbers.get(i + 1);
operations.remove(i);
operationNumbers.remove(i);
operationNumbers.remove(i);
operationNumbers.add(i, temp);
i--;
break;
case '/':
temp = operationNumbers.get(i);
if (operationNumbers.get(i + 1) != 0
&& operationNumbers.get(i)
% operationNumbers.get(i + 1) == 0) {
temp = temp / operationNumbers.get(i + 1);
operations.remove(i);
operationNumbers.remove(i);
operationNumbers.remove(i);
operationNumbers.add(i, temp);
i--;
} else {
return "";
}
}
}
if (operations.size() != 0) {
sb.append(operationNumbers.get(0));
for (int i = 0; i < operations.size(); i++) {
sb.append(operations.get(i)).append(
operationNumbers.get(i + 1));
}
return sb.toString();
} else {
return operationNumbers.get(0).toString();
}
} else {
return str;
}
}
// 判断是否符合要求并输出
public static void output(String str) {
for (int i = 0; i < Math.pow(5, str.length() - 1); i++) {
StringBuilder sb = new StringBuilder(str);
String s = Integer.toString(i, 5); // 转换成5进制
for (int j = 0; j < s.length(); j++) {
if ('1' == s.charAt(s.length() - j - 1)) {
sb.insert(s.length() - j, '+');
} else if ('2' == s.charAt(s.length() - j - 1)) {
sb.insert(s.length() - j, '-');
} else if ('3' == s.charAt(s.length() - j - 1)) {
sb.insert(s.length() - j, '*');
} else if ('4' == s.charAt(s.length() - j - 1)) {
sb.insert(s.length() - j, '/');
}
}
String string = sb.toString();
String newString = getAddAndSubString(string);
if (getResult(newString) == 110L) {
System.out.println(string + " = 110");
}
}
}
}
1234567890中间加上+、-、*、/或者""后变成的等式结果为110
最新推荐文章于 2020-04-15 16:54:04 发布