版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/shuaixingrumo/article/details/78305630
题目大概是: 从1到9, 在中间插入+ - 符号, 使其和等于100
源码如下:
#include <stdio.h>
#include <vector>
#include <QTime>
using namespace std;
int data[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
char flag[] = {' ', '+', '-'};
int id[sizeof(data)/sizeof(int)-1] = {0};
int nCount = 0;
void CheckFunc(int* index, int count)
{
nCount ++;
vector<int> vecData;
vector<char> vecFlag;
for(int i = 0; i < count; i++)
{
if(flag[index[i]] == ' ')
{
if(i == 0)
{
vecData.push_back(data[0]);
}
int tmp = vecData[vecData.size()-1];
vecData[vecData.size()-1] = tmp*10+data[i+1];
}
else
{
if(i == 0)
{
vecData.push_back(data[i]);
}
vecFlag.push_back(flag[index[i]]);
vecData.push_back(data[i+1]);
}
}
int sum = 0;
int ns = vecFlag.size();
for (int j = 0; j < ns; j++)
{
if(vecFlag[j] == '+')
{
if(j == 0)
{
sum = vecData[0]+vecData[1];
}
else
{
sum += vecData[j+1];
}
}
else if(vecFlag[j] == '-')
{
if(j == 0)
{
sum = vecData[0]-vecData[1];
}
else
{
sum -= vecData[j+1];
}
}
}
if(sum == 100)
{
printf("%d",vecData[0]);
for(int i = 0; i < ns; i++ )
{
printf("%c", vecFlag[i]);
printf("%d", vecData[i+1]);
}
printf("=100\n");
}
}
void ForFunc(int index, int size)
{
int n = sizeof(flag)/sizeof(char);
if(index < size)
for(int i = 0; i < n; i++)
{
id[index] = i;
ForFunc(index+1, size);
}
else
{
CheckFunc(id, size);
}
}
int main(int argc, char* argv[])
{
QTime time;
time.start();
ForFunc(0, sizeof(data)/sizeof(int)-1);
printf("count:%d\n", nCount);
printf("%lfs\n", time.elapsed()/1000.0);
return 0;
}
运行结果:
123+45-67+8-9=100
123+4-5+67-89=100
123-45-67+89=100
123-4-5-6-7+8-9=100
12+3+4+5-6-7+89=100
12+3-4+5+67+8+9=100
12-3-4+5-6+7+89=100
1+23-4+56+7+8+9=100
1+23-4+5+6+78-9=100
1+2+34-5+67-8+9=100
1+2+3-4+5+6+78+9=100
count:6561
0.032000s
Press <RETURN> to close this window...
ForFunc用来列举出所有可能的表达式
CheckFunc用来找出这些表达式计算结果为100的, 先生成一个新列表, 新列表中的元素不固定, 所以用了vector类型来存储, 新元素列表把中间有空操作符的元素合并成
一个, 再把加减运算符生成一个列表, 然后计算表达式为100的打印出来
这个题还可以扩展一下, 就是添加加减乘除运算符, 是计算结果为100, 也可以编程1到10或者11这样扩展data数组列表, 下面是python代码, 用来找出计算1到9中插入加减
乘除,结果为100的表达式
import math
list = [1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0]
list_flag = ['', '+', '-', '*', '/']
i = [0,0,0,0,0,0,0,0]
count = 0
def Is2Power(num):
if num > 0 and (num&(~num+1)) == num:
return True;
return False;
def getEle(flag = []):
l = []
l2 = []
l_flag = []
l_flag2 = []
for i in range(len(flag)):
if list_flag[flag[i]] != '':
l_flag.append(list_flag[flag[i]])
if i == 0:
l.append(list[i])
l.append(list[i+1])
else:
l.append(list[i+1])
else:
if i == 0:
l.append(list[0]*10+list[1])
else:
tmp = l[len(l)-1]
l[len(l)-1] = tmp*10 + list[i+1]
for k in range(len(l_flag)):
if l_flag[k] != '*' and l_flag[k] != '/':
l_flag2.append(l_flag[k])
if k == 0:
l2.append(l[0])
l2.append(l[1])
else:
l2.append(l[k+1])
else:
if l_flag[k] == '*':
if k == 0:
l2.append(l[0]*l[1])
else:
tmp = l2[len(l2)-1]
l2[len(l2)-1] = tmp*l[k+1]
elif l_flag[k] == '/':
if k == 0:
l2.append(l[0]/l[1])
else:
tmp = l2[len(l2)-1]
if tmp % l[k+1] != 0:
if not Is2Power(math.floor(l[k+1])):
if tmp < l[k+1] and l[k+1]%tmp != 0:
return;
l2[len(l2)-1] = tmp/l[k+1]
if len(l2) == 0:
l2 = l
l_flag2 = l_flag
sum = l2[0]
for j in range(len(l_flag2)):
if l_flag2[j] == '+':
sum += l2[j+1]
elif l_flag2[j] == '-':
sum -= l2[j+1]
if sum == 100.0:
print(l[0], end='')
for i in range(len(l_flag)):
print(l_flag[i], end='')
print(l[i+1], end='')
print('=',end='')
print(100)
for i[0] in range(len(list_flag)):
for i[1] in range(len(list_flag)):
for i[2] in range(len(list_flag)):
for i[3] in range(len(list_flag)):
for i[4] in range(len(list_flag)):
for i[5] in range(len(list_flag)):
for i[6] in range(len(list_flag)):
for i[7] in range(len(list_flag)):
count += 1
getEle(i)
print(count)
运行结果如下:(没有验证, 欢迎大家指正错误)
1:123+45-67+8-9=100
2:123+4-5+67-89=100
3:123+4*5-6*7+8-9=100
4:123-45-67+89=100
5:123-4-5-6-7+8-9=100
6:12+34+5*6+7+8+9=100
7:12+34-5+6*7+8+9=100
8:12+34-5-6+7*8+9=100
9:12+34-5-6-7+8*9=100
10:12+3+4+5-6-7+89=100
11:12+3+4-56/7+89=100
12:12+3-4+5+67+8+9=100
13:12+3*45+6*7-89=100
14:12+3*4+5+6+7*8+9=100
15:12+3*4+5+6-7+8*9=100
16:12+3*4-5-6+78+9=100
17:12-3+4*5+6+7*8+9=100
18:12-3+4*5+6-7+8*9=100
19:12-3-4+5-6+7+89=100
20:12-3-4+5*6+7*8+9=100
21:12-3-4+5*6-7+8*9=100
22:12*3-4+5-6+78-9=100
23:12*3-4-5-6+7+8*9=100
24:12*3-4*5+67+8+9=100
25:12/3+4*5-6-7+89=100
26:12/3+4*5*6-7-8-9=100
27:12/3+4*5*6*7/8-9=100
28:12/3/4+5*6+78-9=100
29:1+234-56-7-8*9=100
30:1+234*5*6/78+9=100
31:1+234*5/6-7-89=100
32:1+23-4+56+7+8+9=100
33:1+23-4+56/7+8*9=100
34:1+23-4+5+6+78-9=100
35:1+23-4-5+6+7+8*9=100
36:1+23*4+56/7+8-9=100
37:1+23*4+5-6+7-8+9=100
38:1+23*4-5+6+7+8-9=100
39:1+2+34-5+67-8+9=100
40:1+2+34*5+6-7-8*9=100
41:1+2+3+4+5+6+7+8*9=100
42:1+2+3-45+67+8*9=100
43:1+2+3-4+5+6+78+9=100
44:1+2+3-4*5+6*7+8*9=100
45:1+2+3*4-5-6+7+89=100
46:1+2+3*4*56/7-8+9=100
47:1+2+3*4*5/6+78+9=100
48:1+2-3*4+5*6+7+8*9=100
49:1+2-3*4-5+6*7+8*9=100
50:1+2*34-56+78+9=100
51:1+2*3+4+5+67+8+9=100
52:1+2*3+4*5-6+7+8*9=100
53:1+2*3-4+56/7+89=100
54:1+2*3-4-5+6+7+89=100
55:1+2*3*4*5/6+7+8*9=100
56:1-23+4*5+6+7+89=100
57:1-23-4+5*6+7+89=100
58:1-23-4-5+6*7+89=100
59:1-2+3+45+6+7*8-9=100
60:1-2+3*4+5+67+8+9=100
61:1-2+3*4*5+6*7+8-9=100
62:1-2+3*4*5-6+7*8-9=100
63:1-2-34+56+7+8*9=100
64:1-2-3+45+6*7+8+9=100
65:1-2-3+45-6+7*8+9=100
66:1-2-3+45-6-7+8*9=100
67:1-2-3+4*56/7+8*9=100
68:1-2-3+4*5+67+8+9=100
69:1-2*3+4*5+6+7+8*9=100
70:1-2*3-4+5*6+7+8*9=100
71:1-2*3-4-5+6*7+8*9=100
72:1*234+5-67-8*9=100
73:1*23+4+56/7*8+9=100
74:1*23+4+5+67-8+9=100
75:1*23-4+5-6-7+89=100
76:1*23-4-56/7+89=100
77:1*23*4-56/7/8+9=100
78:1*2+34+56+7-8+9=100
79:1*2+34+5+6*7+8+9=100
80:1*2+34+5-6+7*8+9=100
81:1*2+34+5-6-7+8*9=100
82:1*2+34-56/7+8*9=100
83:1*2+3+45+67-8-9=100
84:1*2+3+4*5+6+78-9=100
85:1*2+3-4+5*6+78-9=100
86:1*2+3*4+5-6+78+9=100
87:1*2-3+4+56/7+89=100
88:1*2-3+4-5+6+7+89=100
89:1*2-3+4*5-6+78+9=100
90:1*2*34+56-7-8-9=100
91:1*2*3+4+5+6+7+8*9=100
92:1*2*3-45+67+8*9=100
93:1*2*3-4+5+6+78+9=100
94:1*2*3-4*5+6*7+8*9=100
95:1*2*3*4+5+6+7*8+9=100
96:1*2*3*4+5+6-7+8*9=100
97:1*2*3*4-5-6+78+9=100
98:1/2*34-5+6-7+89=100
99:1/2*3/4*56+7+8*9=100
100:1/2/3*456+7+8+9=100
390625