思路:
因为只可以两两数之间填运算符,所以最多只有八个位置可以填,填充情况分别是:不填、+、-
所以可以用DFS填充好八个位置,然后判断当前填充方案的运算结果是否等于x,复杂度为3的8次方
但是这题的计算过程很复杂,我采用的方法是先将运算符填充进去构成一个完整的计算表达式,然后将这个字符串求解
求解运算表达式的思路是:
将表达式中的数字放入num数组,运算符放入op数组,这里num中的元素个数为op元素个数+1
先将num【0】赋值给sum,从第二个数字开始循环,同时取出一个数字和操作符,进行相应的计算并赋值给sum
#include<iostream>
#include<string>
#include<vector>
#include<stdlib.h>
using namespace std;
vector<int> v(8);
int x,cnt=0;
string f()//根据v将表达式写好
{
string s="1";
for(int i=0;i<8;i++)
{
if(v[i]==1)s+='+';
else if(v[i]==2)s+='-';
char c=i+2+'0';
s+=c;
}
return s;
}
int s2i(string a)
{
int sum;
vector<char> op;
vector<int> num;
int pre=0;
for(int i=0;i<a.size();i++)
{
if(a[i]=='+'||a[i]=='-')
{
num.push_back(atoi(a.substr(pre,i-pre).c_str()));
pre=i+1;
op.push_back(a[i]);
}
}
num.push_back(atoi(a.substr(pre,10).c_str()));
sum=num[0];
for(int i=0;i<op.size();i++)
{
if(op[i]=='+')sum+=num[i+1];
else if(op[i]=='-')sum-=num[i+1];
}
return sum;
}
void dfs(int index)//表示填的第几个空
{
if(index==8)
{
string str=f();
if(s2i(str)==x)
{
cnt++;
cout<<str<<" = "<<x<<endl;
}
return;
}
for(int i=0;i<3;i++)//0是不填,1是+,2是-
{
v[index]=i;
dfs(index+1);
}
}
int main()
{
cin>>x;
dfs(0);
cout<<cnt<<endl;
return 0;
}
运行结果