编程:等式变换

参考链接: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;
}


猜你喜欢

转载自blog.csdn.net/u012462822/article/details/50996739