所以我有这个函数和这些全局变量。
int recurs=0;
std::string sign="";
void count2(int k, std::vector<int> d, int total, int temp, bool flag, unsigned short int pos){
std::string mas="+";
std::string menos="-";
if(pos==(d.size())){
total+=temp;
if(total==k){
result++;
std::cout << sign << "=" << k<<std::endl;
str="";
}
recurs++;
return;
}
//Sum sign.
sign=sign.substr(0,sign.size()-recurs*2);
sign.append(mas+=std::to_string(d[pos]));
count2(k,d,total+temp,+d[pos],true,pos+1);
//Rest sign
sign=sign.substr(0,sign.size()-recurs*2);
sign.append(menos+=std::to_string(d[pos]));
count2(k,d,total+temp,-d[pos],false,pos+1);
//Append digit
if(flag==true)
count2(k,d,total,10*temp-d[pos],true,pos+1);
else
count2(k,d,total,+10*temp+d[pos],false,pos+1);
}
这个函数被调用如下:
count2(6,{1,2,3,3,3},0,0,true,0);
它的作用:给定一个向量v,它组合了和,减法和数字,每当这个组合等于第一个参数时,全局变量result
就会增加。例如,count2(6,{1,2,3,3,3},0,0,true,0);
会使result
为5.因为有5种方法可以将这些数字相加/相加6,例如:1+2+3+3-3
1+2-3+3+3
和其他一些数字。它完美地运作。此外,不使用变量字符串str
。
有什么问题?没什么,但我想知道这些组合是什么。我想要打印的功能就像:
1+2+3+3-3
1+2-3+3+3
-1-2+3+3+3
1+2+3-3+3
问题是什么?我想知道如何正确打印总数等于k的操作数。 如果你去run this code in ideone,它会打印:是的,这是我的实际结果。但是不正确,因为没有总和,如+3或+ 3 + 3 + 3 + 3 + 3 + 3 + ....
+1+2+3+3-3=6
+3=6
+3-3+3-3-3+3+3=6
+3-3+3-3-3+3+3-3-3+3-3+3-3+3+3-3-3+3-3+3-3-2+3+3+3-3-3+3-3+3-3-3+3+3-3-3+3-3+3-3+3+3-3-3+3-3+3-3+3+3+3-3-3+3-3+3-3-3+3+3-3-3+3-3+3-3+3+3-3-3+3-3+3-3-1+2+3+3+3-3-3+3-3+3-3-3+3+3-3-3+3-3+3-3+3+3-3-3+3-3+3-3-2+3+3+3=6
+3-3+3-3-3+3+3-3-3+3-3+3-3+3+3-3-3+3-3+3-3-2+3+3+3-3-3+3-3+3-3-3+3+3-3-3+3-3+3-3+3+3-3-3+3-3+3-3+3+3+3-3-3+3-3+3-3-3+3+3-3-3+3-3+3-3+3+3-3-3+3-3+3-3-1+2+3+3+3-3-3+3-3+3-3-3+3+3-3-3+3-3+3-3+3+3-3-3+3-3+3-3-2+3+3+3-3-3+3-3+3-3-3+3+3-3-3+3-3+3-3+3+3-3-3+3-3+3-3+3+3+3-3-3+3-3+3-3-3+3+3-3-3+3-3+3-3+3+3-3-3+3-3+3-3+2+3+3+3-3-3+3-3+3-3-3+3+3-3-3+3-3+3-3+3+3-3-3+3-3+3-3-2+3+3+3=6
正确的结果 可以看起来像:
1+2+3+3-3
1+2+3-3+3
1+2-3+3+3
-1-2 + 3 + 3 + 3
问题已解答!
答案 0 :(得分:1)
如果您不介意我稍微更改功能签名,我可以建议以下内容吗?
int recurs = 0;
void count2(int k, std::vector<int> d, int total = 0, std::string temp = "", unsigned short pos = 0)
{
if(pos == d.size())
{
//test total number
if(total == k)
{
std::cout << temp <<"=" << k << std::endl;
recurs++;
}
}
else
{
//test each operator on next number in sequence
count2(k, d, total + d[pos], temp + ((pos) ? "+":"") + std::to_string(d[pos]), pos + 1);
count2(k, d, total - d[pos], temp + "-" + std::to_string(d[pos]), pos + 1);
}
}
条件运算符将从头开始删除“+”符号。默认值使函数更容易从main或where调用。通过将温度作为string
发送,可以更容易地跟踪最终的等式,并将其作为全局变量删除。它还消除了对bool flag
变量的需求。最后,在函数调用中更新total
以从函数体中删除杂乱。
答案 1 :(得分:0)
所以最后count2看起来像这样:
void count2(int k, std::vector<int> d, int total, int temp, bool flag, unsigned short int pos, std::vector<std::string> s){
//std::cout << temp << " ";
if(pos==(d.size())){
total+=temp;
if(total==k){
result++;
for(unsigned short int i=0;i<d.size();i++){
std::cout << s[i] << d[i];
}
std::cout << "=" << k <<"\n";
}
return;
}
s[pos]="+";
count2(k,d,total+temp,+d[pos],true,pos+1,s);
//put a - sign in pos
s[pos]="-";
count2(k,d,total+temp,-d[pos],false,pos+1,s);
if(pos==0) return;
//Append digit
if(flag==true){
s[pos]="";
//std::cout << "<0 " << 10*temp-d[pos] << " ";
count2(k,d,total,(10*temp-d[pos]),true,pos+1,s);
}
else{
s[pos]="";
//std::cout << ">0" << 10*temp+d[pos] << " ";
count2(k,d,total,10*temp+d[pos],false,pos+1,s);
}
}
你可以看到而不是使用字符串变量,我正在使用字符串向量,这使它适用于递归调用。