2011-02-26 wcdj
题目: 在1 2 3 4 5 6 7 8 9九个数字中插入“+”或“-”符号使得结果为100,编程实现所有的组合。 注意:数字的顺序不能改变。 如: 123 - 45 - 67 + 89 = 100 12 - 3 -4 + 5 - 6 + 7 + 89 = 100 …… 一种算法思路: (1) 使用递归实现所有组合情况。 (2) 删除字符串中空格的方法。 (3) 对表达式进行词法分析,设计一个类来实现“+”和“-”两种算术运算。
#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