加减乘除的组合运算

本文介绍了一种通过加法、加减法及加减乘除法来找出数组中能组合成特定值的所有元素组合的方法。文章详细展示了不同情况下递归算法的实现过程,并讨论了可能遇到的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

求一个数组中仅用加法得到指定值

int getsum(std::vector<int> v)
{
     vector<int>::iterator it = v.begin();
     int sum = 0;
     for (; it != v.end(); it++)
          sum += *it;
     return sum;
}
void print(vector<int> v)
{
     vector<int>::iterator it = v.begin();
     for (; it != v.end(); it++)
          cout << *it << ' ';
     cout << endl;
}

void sumCombine(std::vector<int> v, int start, int valSum,vector<int> sum)
{     
     if (getsum(sum) == valSum)
     {
          print(sum);
          return;
     }     

     for (int i = start; i < v.size(); i++)
     {
          sum.push_back(v.at(i));
          sumCombine(v, i + 1, valSum,sum);
          sum.pop_back();
     }

}

分析:1.选择元素i,从剩下的n-1元素中选择组合为sum-i的元素
2.不选择元素i,从剩下的n-1个元素中选择组合为sum的元素
此时的操作是+a+b+c

仅用加法和减法求数组中的元素组合为指定值

void sumCombine(std::vector<int> v, int start, int valSum,vector<int> sum)
{     
     if (getsum(sum) == valSum)
     {
          print(sum);
          return;
     }     

     for (int i = start; i < v.size(); i++)
     {
          sum.push_back(v.at(i));
          sumCombine(v, i + 1, valSum,sum);
          sum.pop_back();

          sum.push_back(-v.at(i));
          sumCombine(v, i + 1, valSum,sum);
          sum.pop_back();
     }

}

分析:因为多了减法,所以一个元素x,可以扮演两种角色
1.x作为加法放入
2.x作为减法放入
此时的操作是+a-b+c的操作

加减乘除组合 得到指定值

分析:此时的操作是 a op b 其中a,b为两个不同的操作数,op为+ - * /中的一种

#define MAX 1000

int getsum(vector<double> svec, vector<char> ssig)
{

    vector<double> vec = svec;
    vector<char> signal = ssig;
    while (!signal.empty() && !vec.empty())
    {
        char s = signal.back();
        signal.pop_back();

        double a = vec.back();
        vec.pop_back();
        double b = vec.back();
        vec.pop_back();

        double c = 0;

        switch (s)
        {
        case '*':
            c = a*b;
            vec.push_back(c);
            break;
        case '/':           
            c = (double)a/b;
            if (c - (int)c != 0)
                return MAX;
            vec.push_back(c);
            break;
        case '-':
            c = a-b;
            vec.push_back(c);
            break;
        case '+':
            c = a+b;
            vec.push_back(c);
            break;
        default:
            break;
        }
    }

    if (!vec.empty())
        return vec.back();
    else
        return MAX;
}

void print(vector<double> vec, vector<char> signal)
{


    while (!signal.empty() && !vec.empty())
    {
        double a = vec.back();
        vec.pop_back();
        cout << a << ' ';
        char s = signal.back();
        signal.pop_back();
        cout << s << ' ';       
    }
    cout << vec.back()<<endl;   
}

void CombineAcl(vector<double> input, int start, vector<double> &output, vector<char> &signal, int m)
{
    if (m == getsum(output, signal))
    {
        print(output, signal);
        return;
    }

    for (int i = start; i < input.size(); i++)
    {
        output.push_back(input.at(i));
        for (int j = i + 1; j < input.size(); j++)
        {   


            output.push_back(input.at(j));
            signal.push_back('*');
            CombineAcl(input, j + 1, output, signal, m);
            signal.pop_back();          

            signal.push_back('+');
            CombineAcl(input, j + 1, output, signal, m);
            signal.pop_back();


            signal.push_back('-');
            CombineAcl(input, j + 1, output, signal, m);
            signal.pop_back();          

            signal.push_back('/');
            CombineAcl(input, j + 1, output, signal, m);
            signal.pop_back();

            output.pop_back();
        }       
        output.pop_back();      
    }
}

注意:
有时结果会有重复,一般只有一个,比如{1,2,3,4,5,6,7} 求给定值6
如果输出为7-4*3 其计算顺序实际是(7-4)*3

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值