等式变换

输入一个正整数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

    public static void main(String[] args) {
        char[] operas=new char[9];
        new Main().dfs(0, 1, ' ', 0, operas, 5);
    } 
    
    public void dfs(int result,int layer,char lastOperation,int lastNumber,char[] operas,int target)
    {
        //本次需要加上的数
        lastNumber*=10;
        lastNumber+=layer;
        if(layer==9)
        {
            result+=('-'==lastOperation?(-1*lastNumber):lastNumber);
            if(result==target)
            {
                StringBuilder stringBuilder=new StringBuilder();
                for(int i=1;i<9;i++)
                {
                    stringBuilder.append(i);
                    if(operas[i]!=' ')
                        stringBuilder.append(operas[i]);
                }
                stringBuilder.append(9);
                System.out.println(stringBuilder.toString());
            }
            return;
        }
        operas[layer]=' ';
        //本次不做加减运算
        dfs(result, layer+1, lastOperation, lastNumber, operas,target);
        result+=('-'==lastOperation?(-1*lastNumber):lastNumber);
        //plus
        operas[layer]='+';
        dfs(result, layer+1, '+', 0, operas,target);
        //minus
        operas[layer]='-';
        dfs(result, layer+1, '-', 0, operas,target);
    }

 输出

12-34+5-67+89
1+23+4-5+6-7-8-9
1+2+34-56+7+8+9
1+2+3+4-5+6-7-8+9
1+2+3+4-5-6+7+8-9
1+2+3-4+5+6-7+8-9
1+2-3+4+5+6+7-8-9
1+2-3-45+67-8-9
1+2-3-4+5-6-7+8+9
1+2-3-4-5+6+7-8+9
1-23+45+6-7-8-9
1-23+4+5-6+7+8+9
1-23-4-56+78+9
1-2+3+4-5-6-7+8+9
1-2+3-4+5-6+7-8+9
1-2+3-4-5+6+7+8-9
1-2-34-56+7+89
1-2-3+4+5+6-7-8+9
1-2-3+4+5-6+7+8-9
1-2-3-4-56+78-9
1-2-3-4-5-6+7+8+9

 

posted @ 2015-06-12 15:23  Maydow  阅读(454)  评论(0编辑  收藏  举报