等式变换
描述: 输入一个正整数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
描述: 输入一个正整数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
解题思路:
1.9个数相加,就是往八个空格里面填写运算符;
2.运算符有三种,一种为空格,一种为’+‘,一种为’-‘;
3.使用递归方法得出所有八个空格的排列序列,将所得序列用于9个数计算结果;
4.3中的结果如果等于题目所要求的值,则这种序列符合
代码:
public class Demo7{
static int count = 0;
public static void main(String[] args) {
int[] result = new int[8];
Demo7 demo = new Demo7();
int target = 5;
demo.search(result, 0, target);
System.out.println(count);
}
//result用来存储运算符,0表示无符号,1表示'+',2表示'-'
public void search(int[] result,int index,int target){
if(index==8){
showResult(result,target);
return;
}else{
for(int i=0;i<3;i++){
result[index] = i;
search(result,index+1,target);
}//for
}
}
private void showResult(int[] result, int target) {
char oper = '+' ;
String[] source = {"1","2","3","4","5","6","7","8","9"};
String num = source[0];
String exp = "";
exp = exp+source[0];
int sum = 0;
for(int i=0;i<result.length;i++){
switch(result[i]){
case 0://无运算符
num=num+source[i+1];
exp=exp+source[i+1];
break;
case 1://'+'
//计算之前的结果
sum = calculator(sum,num,oper);
oper = '+';
num = source[i+1];
exp = exp+'+'+source[i+1];
// sum = calculator(sum, num, oper);
break;
case 2:
sum = calculator(sum, num, oper);
oper = '-';
num = source[i+1];
exp = exp+'-'+source[i+1];
break;
}
}
//最后一个num没有计算
sum = calculator(sum, num, oper);
if(sum==target){
System.out.println(exp+"="+target);
count++;
}
}
private int calculator(int sum, String num, char oper) {
if(oper=='+'){
sum = sum+Integer.parseInt(num);
}else{
sum = sum - Integer.parseInt(num);
}
return sum;
}
}