网上找了一个算法题练练手

版权声明:本文为博主原创文章,未经博主允许不得转载。 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...

答题思路是:1到9中间有8个位置, 每个位置可以放空,+, -三种类型, 所以组合种类为3^8种, 也就是6561种, 开始用8个嵌套的for循环, 每个循环flag数组的元素个数, 后来改为递归函数, 这样改的思路是方便扩展, 如果data数组中增加, 或者删减元素, 我们只需要该data数组中的数据

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
 
 

 
 
 
 
 
 
 

猜你喜欢

转载自blog.csdn.net/shuaixingrumo/article/details/78305630