[华为机试真题][2014]63.等式变换

题目

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

代码

/*---------------------------------------
*   日期:2015-07-06
*   作者:SJF0115
*   题目:等式变换
*   来源:华为机试真题
-----------------------------------------*/
#include <iostream>
#include <string>
#include <vector>
#include <stack>
#include <algorithm>
using namespace std;

// 整型转换为字符串
string Int2Str(int num){
    string str;
    if(num == 0){
        str = '0';
        return str;
    }//if
    int tmp = num;
    while(num){
        str.insert(str.begin(),num % 10 + '0');
        num /= 10;
    }//while
    return str;
}

/* 
当前计算值              result 
符合的等式个数          count 
等式结果                x
相邻数合并的结果        sequence    1 + 2 + 345  345 就是 sequence 
*/   
void helper(vector<int> &num,int index,int x,int result,int sequence,int &count,string op){
    if(index == num.size()){
        if(result + sequence == x || result - sequence == x){
            ++count;
            if(result + sequence == x){
                op += "+"+Int2Str(sequence);
            }//if
            else{
                op += "-"+Int2Str(sequence);
            }//else
            cout<<op<<endl;
        }//if
        return;
    }//if
    // 连续数
    helper(num,index+1,x,result,sequence * 10 + num[index],count,op);

    // 加法 +
    if(op.size() > 0){
        // 以num[index]为sequence的起点
        helper(num,index+1,x,result + sequence,num[index],count,op+"+"+Int2Str(sequence));
    }//if
    else{
        // 以num[index]为sequence的起点
        helper(num,index+1,x,result + sequence,num[index],count,op+Int2Str(sequence));
    }//else


    if(op.size() > 0){
        // 减法-
        // 以num[index]为sequence的起点
        helper(num,index+1,x,result - sequence,num[index],count,op+"-"+Int2Str(sequence));
    }//if
}

int TransformationEquation(vector<int> num,int x){
    int count = 0;
    string op = "";
    helper(num,1,x,0,num[0],count,op);
    return count;
}

int main(){
    int n,x;
    int num;
    //freopen("C:\Users\Administrator\Desktop\acm.in","r",stdin);
    while(cin>>n>>x){
        vector<int> vec;
        for(int i = 0;i < n;++i){
            cin>>num;
            vec.push_back(num);
        }//for
        cout<<TransformationEquation(vec,x)<<endl;
    }//while
    return 0;
}
原文地址:https://www.cnblogs.com/mthoutai/p/7092795.html