// ConsoleApplication4.cpp: 定义控制台应用程序的入口点。 // #include "stdafx.h" using namespace std; int a, num = 0; bool start(char *s, int a); bool END; //找到符合要求的式子的标记 //预留三个括号位 #define DIGIT_1 3 #define DIGIT_2 11 #define DIGIT_3 19 #define DIGIT_4 27 #define DIGIT_5 35 #define DIGIT_6 43 #define NEGATIVE 126 //126表示负数 bool operator_flag[5] = {}; char expression[47] = {}; //表达式数组,0表示缺省 char operator_list[4] = { '+','-','*','^' }; //运算符种类 array <char, 5> pre_list_tmp; vector <array<char, 5>> pre_list; //全部运算符排列的列表 vector <int> bracket_set; //括号标记 vector <vector<int>> bracket_list; //全部括号列表 map <long long, bool> flag; //枚举状态标记,用于去重 void init() { memset(expression, 0, sizeof(expression)); flag.clear(); END = false; expression[DIGIT_1] = '1'; expression[DIGIT_2] = '1'; expression[DIGIT_3] = '4'; expression[DIGIT_4] = '5'; expression[DIGIT_5] = '1'; expression[DIGIT_6] = '4'; } void operator_add(int); void bracket_add(int); void bracket_add_1(); //void bracket_add_2(int); //void bracket_add_3(int); void calculate(); int d_pow(int a, int b); //整数乘方函数 int main() { operator_add(0); bracket_add(0); while (cin >> a) { init(); bracket_add_1(); if (END) continue; expression[DIGIT_1] = NEGATIVE; //把第一个数变为负数 flag.clear(); bracket_add_1(); if (!END) cout << "Can not find!" << num << endl; } return 0; } void operator_add(int x) { bool flag = true; for (int i = 0; i < 5 && flag; i++) { if (!operator_flag[i]) flag = false; } if (flag) { pre_list.push_back(pre_list_tmp); return; } operator_flag[x] = true; for (int i = 0; i < 4; i++) { pre_list_tmp[x] = operator_list[i]; operator_add(x + 1); } operator_flag[x] = false; } void bracket_add(int x) { if (x > 7) { //可插入括号的位置总数。 return; } if (bracket_set.size() == 2) { vector <int> tmp; switch (bracket_set[0]) { case 0: tmp.push_back(DIGIT_1); break; case 1: tmp.push_back(DIGIT_2); break; case 2: tmp.push_back(DIGIT_3); break; case 3: tmp.push_back(DIGIT_4); break; case 4: tmp.push_back(DIGIT_5); break; case 5: tmp.push_back(DIGIT_6); break; } switch (bracket_set[1]) { case 1: tmp.push_back(DIGIT_1); break; case 2: tmp.push_back(DIGIT_2); break; case 3: tmp.push_back(DIGIT_3); break; case 4: tmp.push_back(DIGIT_4); break; case 5: tmp.push_back(DIGIT_5); break; case 6: tmp.push_back(DIGIT_6); break; } bracket_list.push_back(tmp); return; } bracket_set.push_back(x); bracket_add(x + 1); bracket_set.pop_back(); bracket_add(x + 1); } void bracket_add_1() { int size = 21; //21 is bracket_list.size() for (int i = 0; i < size; i++) { int sum = 0; /* *去重思路:左右括号各有6个可能出现的位置,每个位置出现的括号最多为2个, *因此用一个至少12位的十进制整数来储存状态,把每个括号的位置的信息储存在 *十进制位之中。 */ sum += d_pow(10, 6 + (bracket_list[i][0] - 3) / 8); sum += d_pow(10, (bracket_list[i][1] - 3) / 8); expression[bracket_list[i][0] - 1] = '('; expression[bracket_list[i][1] + 1] = ')'; for (int j = 0; j < size; j++) { sum += d_pow(10, 6 + (bracket_list[j][0] - 3) / 8); sum += d_pow(10, (bracket_list[j][1] - 3) / 8); expression[bracket_list[j][0] - 2] = '('; expression[bracket_list[j][1] + 2] = ')'; if (!flag[sum]) { flag[sum] = true; calculate(); } if (END) return; expression[bracket_list[j][0] - 2] = 0; expression[bracket_list[j][1] + 2] = 0; } expression[bracket_list[i][0] - 1] = 0; expression[bracket_list[i][1] + 1] = 0; } } void calculate() { int size = pre_list.size(); for (int i = 0; i < size; i++) { for (int j = 0; j < 5; j++) { switch (j) { case 0: expression[DIGIT_1 + 4] = pre_list[i][j]; break; case 1: expression[DIGIT_2 + 4] = pre_list[i][j]; break; case 2: expression[DIGIT_3 + 4] = pre_list[i][j]; break; case 3: expression[DIGIT_4 + 4] = pre_list[i][j]; break; case 4: expression[DIGIT_5 + 4] = pre_list[i][j]; break; } } /*string input; for (int j = 0; j < 47; j++) { if (expression[j]) input.push_back(expression[j]); }*/ //计算器接口 END = start(expression, a); num++; if (END) return; } }
文章评论