参考链接:http://blog.csdn.net/hackbuteer1/article/details/39253767#comments
题目:输入一个正整数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
分析:对于表达式操作的编程一直不太擅长,这道题也看了很久,依照别人的思路写了一种,应该是能运行出正确结果,但是感觉写的还不是很好,先记录下,以后再看。
#include <iostream>
using namespace std;
int result, counter = 0;
//opt=[-1,0,1]分别表示{'-',' ','+'}
void dfs(int layer,int lastSum,int lastNum,int opt)
{
if (layer == 9)
{
if (opt == 0)
{
lastSum = lastSum * 10 + lastNum;
if (result == lastSum + layer)
counter++;
else if (result == lastSum - layer)
counter++;
else if (result == lastSum * 10 + layer)
counter++;
}
else
{
if (result == (lastSum + opt*lastNum + layer))
counter++;
else if (result == (lastSum + opt*lastNum - layer))
counter++;
else if (result == (lastSum + opt*(lastNum * 10 + layer)))
counter++;
}
return;
}
if (opt == 0)
{
lastSum = lastSum * 10 + lastNum;
dfs(layer + 1, lastSum, layer, 1);
dfs(layer + 1, lastSum, layer, -1);
dfs(layer + 1, lastSum, layer, 0);
}
else
{
dfs(layer + 1, lastSum + opt*lastNum, layer, 1);
dfs(layer + 1, lastSum + opt*lastNum, layer, -1);
dfs(layer + 1, lastSum , lastNum*10+layer, opt);
}
return;
}
int main()
{
result = 5;
dfs(2, 0, 1, 0);
cout << counter << endl;
return 0;
}