共有多少种等式

Q:共有多少种等式?
题目描述:
有如下式子: n 1 ? n 2 ? n 3 ? n 4 = n 5 n_1?n_2?n_3?n_4=n_5 n1?n2?n3?n4=n5 。其中, ? ? ?代表四则运算(+,-,*,/)。对于给定的 n 1 , n 2 , n 3 , n 4 n_1,n_2,n_3,n_4 n1,n2,n3,n4,请问存在多少种不同的运算符组合可以使得等式成立?例如当输入为1 2 3 4 5时,即表示求满足 1 ? 2 ? 3 ? 4 = 5 1?2?3?4=5 1?2?3?4=5的运算符数,易得,有 1 + 2 / 3 + 4 = 5 1+2/3+4=5 1+2/3+4=5 1 − 2 / 3 + 4 = 5 1-2/3+4=5 12/3+4=5两种组合,即答案为2。

输入:
n 1 , n 2 , n 3 , n 4 , n 5 n_1,n_2,n_3,n_4,n_5 n1,n2,n3,n4,n5的值,此题有多组输入数据
输出:
满足条件的等式个数,每组数据一行。
样例输入:
1 2 3 4 5
5 4 2 3 1
1 1 1 1 1
2 2 2 2 2
3 3 3 3 3
样例输出:
2
4
20
4
4

测试输入:
2 3 4 5 6
7 8 9 10 11
3 4 5 6 7
8 9 1 1 1
2 3 6 4 9
1 2 1 2 1
2 1 1 2 3
5 6 1 2 1

测试输出:
4
0
2
5
2
10
7
4

Sample Code:

#include

char ch[] = {
     '+', '-', '*', '/'};
char s[10];
int a[10], k[10];
int ans;

void dfs(int x) {
     
    if (x == 4) {
     
        for (int i = 1; i < 6; i++) {
     
            a[i] = k[i];
        }
        int res = 0, t[10];
        int cnt = 0;
        for (int i = 1; i < 4; i++) {
     
            if (s[i] == '*') {
     
                a[i + 1] *= a[i];
            } else if (s[i] == '/') {
     
                a[i + 1] = a[i] / a[i + 1];
            } else {
     
                t[cnt++] = a[i];
            }
        }
        t[cnt] = a[4];
        res += t[0];
        cnt = 0;
        for (int i = 1; i < 4; i++) {
     
            if (s[i] == '+') {
     
                res += t[++cnt];
            }
            if (s[i] == '-') {
     
                res -= t[++cnt];
            }
        }
        if (res == a[5]) {
     
            ans++;
        }
        return;
    }
    for (int i = 0; i < 4; i++) {
     
        s[x] = ch[i];
        dfs(x + 1);
    }
}

int main() {
     
    while (~scanf("%d%d%d%d%d", &k[1], &k[2], &k[3], &k[4], &k[5])) {
     
        ans = 0;
        dfs(1);
        printf("%d\n", ans);
    }
    return 0;
}

你可能感兴趣的:(程序设计基础,图论,c语言,算法)