题目描述:
输入一个正整数X,在下面的等式左边的数字之间添加+号或者-号,使得等式成立。
1 2 3 4 5 6 7 8 9 = X
比如:
12-34+5-67+89 = 5
1+23+4-5+6-7-8-9 = 5
请编写程序,统计满足输入整数的所有整数个数。
输入: 正整数,等式右边的数字
输出: 使该等式成立的个数
样例输入:5
样例输出:21(此处是21,不是23)
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
/**
* 输入一个正整数X,在下面的等式左边的数字之间添加+号或者-号,使得等式成立。 1 2 3 4 5 6 7 8 9 = X 比如:
* 12-34+5-67+89 = 5 1+23+4-5+6-7-8-9 = 5 请编写程序,统计满足输入整数的所有整数个数。 输入: 正整数,等式右边的数字
* 输出: 使该等式成立的个数 样例输入:5 样例输出:23
*
* */
public class EquationTran {
public static void main(String[] args) {
transfer(5);
}
/*1、
* 1 2 3 4 5 6 7 8 9中间有8个位置可以用来填充符号+,-或空。0代表+,1代表-,2代表空
* 采用三进制则符号位的表达式从00000000——22222222。转为十进制是0——6560,共6561中可能
*2、那么就有6561中计算表达式。穷举这6561中表达式,并计算结果,与输入数字相等的,则输出
*/
public static void transfer(int number){
//定义哈希表存放符号情况
// 采用三进制则符号位的表达式从00000000——22222222。转为十进制是0——6560,共6561中可能
final int table_size=6561;
String equation="1 2 3 4 5 6 7 8 9";
String equationTran;
int count=0;//符合的表达式的个数
for (int i = 0; i < table_size; i++) {
String symbol=get_3x(i);
StringBuilder sb=new StringBuilder(equation);
for (int j = 0; j < 8; j++) {
//0代表+,1代表-,2代表空
char temp=symbol.charAt(j);
if(temp=='0'){
sb.replace(j*2+1, j*2+2, "+");
}else if(temp=='1'){
sb.replace(j*2+1, j*2+2, "-");
}
}
equationTran=sb.toString().replaceAll(" ", "");//将空格去掉
//判断表达式计算值是否与输入的值相等
if(equal(equationTran,number)){
count++;
System.out.println(equationTran);
}
}
System.out.println(count);
}
private static boolean equal(String equationTran, int number) {
if(!equationTran.contains("+")&&!equationTran.contains("-")){//当前的equationTran为123456789
if(Integer.valueOf(equationTran)==number)
return true;
else
return false;
}else{
StringTokenizer st = new StringTokenizer(equationTran,"+,-",true);//分割字符串
List<String> list=new ArrayList<String>();
while(st.hasMoreElements()){
list.add((String) st.nextElement());
}
int i=0;
int result=Integer.valueOf(list.get(0));//第一个数
for (i=1;i<list.size();) {
String str=list.get(i);
if("+".equals(str)){
result+=Integer.valueOf(list.get(i+1));
}else if("-".equals(str)){
result-=Integer.valueOf(list.get(i+1));
}
i+=2;
}
if(result==number)
return true;
else
return false;
}
}
/**
* @param i
* @return
* 将对应的整型数字转为3进制符号表达式
*/
private static String get_3x(int i) {
StringBuilder sb=new StringBuilder();
int remain=0;
int number=i;
while(number>=3){
remain=number%3;
sb.append(remain);
number=number/3;
}
sb.append(number);
int len=sb.length();
for (int j = 0; j < 8-len; j++) {
sb.append(0);
}
String symbol=sb.reverse().toString();
return symbol;
}
}