1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
// 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;
}
}