【编程习题★★★☆☆】等式变换求解

原题:

输入一个正整数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();
	}
}


修改递归终止条件可以处理不同和的情况。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值