//重新写的一个简单的CAL
#include <iostream>
using namespace std;
class CAL
{
enum{NUMBER, OPERATOR, END, UNKNOWN};
class Token
{
public:
int value;
int type;
};
const char* buff;
int curr;
Token tk;
public:
int Evalue(const char* exp)
{
int value = 0;
int sign = 1;
buff = exp;
curr = 0;
do{
MoveToNextToken();
switch (tk.type)
{
case NUMBER: value += sign * tk.value;break;
case OPERATOR: sign = tk.value == '+' ? 1 : -1;
}
}while (tk.type==NUMBER||tk.type==OPERATOR);
return value;
}
void MoveToNextToken()
{
static char temp[256];
tk.type = UNKNOWN, tk.value = 0;
if (!buff[curr])
{
tk.type = END;
return;
}
if (buff[curr]>='0'&&buff[curr]<='9')
{
int value = 0;
while (buff[curr]&&buff[curr]>='0'&&buff[curr]<='9')
value = value * 10 + buff[curr++] - '0';
tk.value = value;
tk.type = NUMBER;
return;
}
switch (buff[curr++])
{
case '+':
tk.type = OPERATOR, tk.value = '+';return;
case '-':
tk.type = OPERATOR, tk.value = '-';return;
}
tk.type = UNKNOWN;
return;
}
};
void DelSpace(char* str)
{
char* curr = str;
while (*curr=*str++)
if (*curr!=' ') curr++;
}
void GetExpression(int a[], int n)
{
static char token[] = {'+','-',' '};
static char buff[256];
static CAL cal;
sprintf(buff, "1%c2%c3%c4%c5%c6%c7%c8%c9",
token[a[0]], token[a[1]], token[a[2]], token[a[3]],
token[a[4]], token[a[5]],token[a[6]], token[a[7]]);
DelSpace(buff);
// cout << buff << endl;
int result = cal.Evalue(buff);
if (result == 100)
cout << buff << '=' << result << endl;
}
void DoEnum(int n, int curr, int to[])
{
if (curr == n)
{
GetExpression(to, n);
}
else
{
for (int i = 0; i < 3; ++i)
{
to[curr] = i;
DoEnum(n, curr+1, to);
}
}
}
int main()
{
int to[8];
DoEnum(8, 0, to);
return 0;
}