修改自
http://blog.csdn.net/keepthinking_/article/details/8521975?reload
等式变换
描述: 输入一个正整数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
#include <iostream>
#include <string>
using namespace std;
int theendnum = 0;
int sumData = 0;
int calc(char operateChar,int sum,string number){
if(operateChar=='+'){
sum+=atoi(number.c_str());
//number.delete(0, number.length());
}else if(operateChar=='-'){
sum-=atoi(number.c_str());
//number.delete(0, number.length());
}
return sum;
}
void showResult(int result[])
{
int sum = 0;
char operateChar = '+';
string source[] = {"1","2","3","4","5","6","7","8","9"};
string number,expression;
number += source[0];
expression += source[0];
for (int i=0; i<8; i++)
{
if(result[i]==0){//如果为0,表示数字合并
number += (source[i+1]);
expression+= (source[i+1]);
}else if(result[i]==1){
sum=calc(operateChar,sum,number);
number.clear();
operateChar='+';
number += (source[i+1]);
expression += ("+");
expression +=(source[i+1]);
}else if(result[i]==2){
sum=calc(operateChar,sum,number);
number.clear();
operateChar='-';
number += (source[i+1]);
expression += ("-");
expression +=(source[i+1]);
}
}
sum=calc(operateChar,sum,number);
if(sum==theendnum){
sumData++;
}
}
void getResult(int index, int result[])
{
if(index==8)
{
showResult(result);
return;
}
for(int i=0;i<3;i++){
result[index]=i;
getResult(index+1,result);
result[index]=0; //恢复原来的状态
}
}
int main()
{
int result[8] = {0};
cin>>theendnum;
getResult(0, result);
cout<<sumData<<endl;
return 0;
}
http://blog.csdn.net/keepthinking_/article/details/8521975?reload