原题:
输入一个正整数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
解法:
可以使用深度优先搜索暴力解决。此处考虑和为100的情况,加数最大位数考虑3位。如下是JAVA的递归参考代码:
public class Total100 {
public Total100() {
String[] arr = new String[20];
arr[0] = "1";
getResult(2, 1, 1, arr);
arr[0] = "12";
getResult(3, 12, 1, arr);
arr[0] = "123";
getResult(4, 123, 1, arr);
}
private void getResult(int num, int sum, int i, String[] arr) {
if (num == 10) {
if (sum == 100)
printResult(i, arr);
} else if (num < 10) {
arr[i] = "+";
arr[i + 1] = String.valueOf(num);
getResult(num + 1, sum + num, i + 2, arr);
arr[i] = "-";
getResult(num + 1, sum - num, i + 2, arr);
arr[i + 1] = String.valueOf(10 * num + num + 1);
getResult(num + 2, sum - (10 * num + num + 1), i + 2, arr);
arr[i] = "+";
getResult(num + 2, sum + (10 * num + num + 1), i + 2, arr);
arr[i + 1] = String.valueOf(100 * num + 10 * (num + 1) + num + 2);
getResult(num + 3, sum + (100 * num + 10 * (num + 1) + num + 2),
i + 2, arr);
arr[i] = "-";
getResult(num + 3, sum - (100 * num + 10 * (num + 1) + num + 2),
i + 2, arr);
}
}
private void printResult(int i, String[] arr) {
for (int n = 0; n < i; n++) {
System.out.print(arr[n]);
}
System.out.println();
}
}
修改递归终止条件可以处理不同和的情况。