#include <stdio.h> #include <string.h> #define max 100 //2021/7/3-12:40 //2021/7/3-15:15 char is_error(char* s) { if (((s[0] == 'j') && (s[1] == 'o')) || ((s[0] == 'J') && (s[1] == 'O'))) { return 1; } char c = s[0]; if ((c != 'J') && (c != 'Q') && (c != 'K') && (c != 'A') && ((c < '1') || (c > '9'))) { return 1; } if ((s[0] == '1') && (s[1] != '0')) { return 1; } return 0; } int get_val(char c) { int v; switch (c) { case 'J': { v = 11; break; } case 'Q': { v = 12; break; } case 'K': { v = 13; break; } case 'A': { v = 1; break; } default: v = c - '0'; break; } return v; } int create_table(int* table, int* expr) { int v[13]; int i, j, k, l, m, n; int s[4]; int ss[4][4]; int cnt; cnt = 0; for (i = 0; i < 13; i++) { v[i] = i + 1; } for (i = 0; i < 13; i++) { //memset(ss, 0, 4 * 4 * sizeof(int)); for (j = 0; j < 13; j++) { s[0] = v[i] + v[j]; s[1] = v[i] - v[j]; s[2] = v[i] * v[j]; s[3] = v[i] / v[j]; for (k = 0; k < 13; k++) { ss[0][0] = s[0] + v[k]; ss[0][1] = s[0] - v[k]; ss[0][2] = s[0] * v[k]; ss[0][3] = s[0] / v[k]; ss[1][0] = s[1] + v[k]; ss[1][1] = s[1] - v[k]; ss[1][2] = s[1] * v[k]; ss[1][3] = s[1] / v[k]; ss[2][0] = s[2] + v[k]; ss[2][1] = s[2] - v[k]; ss[2][2] = s[2] * v[k]; ss[2][3] = s[2] / v[k]; ss[3][0] = s[3] + v[k]; ss[3][1] = s[3] - v[k]; ss[3][2] = s[3] * v[k]; ss[3][3] = s[3] / v[k]; for (l = 0; l < 13; l++) { for (m = 0; m < 4; m++) { for (n = 0; n < 4; n++) { if (ss[m][n] + v[l] == 24) { expr[cnt] = (m << 4) | (n << 2) | 0; table[cnt++] = (v[i] << 12) | (v[j] << 8) | (v[k] << 4) | v[l]; } else if (ss[m][n] - v[l] == 24) { expr[cnt] = (m << 4 | n << 2) | 1; table[cnt++] = (v[i] << 12) | (v[j] << 8) | (v[k] << 4) | v[l]; } if (ss[m][n] * v[l] == 24) { expr[cnt] = (m << 4 | n << 2) | 2; table[cnt++] = (v[i] << 12) | (v[j] << 8) | (v[k] << 4) | v[l]; } if (ss[m][n] / v[l] == 24) { expr[cnt] = (m << 4) | (n << 2) | 3; table[cnt++] = (v[i] << 12) | (v[j] << 8) | (v[k] << 4) | v[l]; } } } } } } } return cnt; } int check_table(int* table, int size, int v) { int i; for (i = 0; i < size; i++) { if (table[i] == v) { return i; } } return -1; } int is_24(int* table, int size, int* c) { int i; int j = -1; int v; int a[24][4] = { {0,1,2,3}, {0,1,3,2}, {0,2,1,3}, {0,2,3,1}, {0,3,1,2}, {0,3,2,1}, {1,0,2,3}, {1,0,3,2}, {1,2,0,3}, {1,2,3,0}, {1,3,0,2}, {1,3,2,0}, {2,0,1,3}, {2,0,3,1}, {2,1,0,3}, {2,1,3,0}, {2,3,0,1}, {2,3,1,0}, {3,0,1,2}, {3,0,2,1}, {3,1,0,2}, {3,1,2,0}, {3,2,0,1}, {3,2,1,0} }; for (i = 0; (i < 24) && (j == -1); i++) { v = (c[a[i][0]] << 12) | (c[a[i][1]] << 8) | (c[a[i][2]] << 4) | c[a[i][3]]; j = check_table(table, size, v); } return j; } int main() { char e[4] = {'+', '-', '*', '/'}; char cvt[16] = {' ', 'A', '2','3','4','5','6','7','8','9','1','J','Q','K'}; int c[4]; char s[max]; int i = 0, j, k, n; int table[20000]; int expr[20000]; int size; int v; size = create_table(table, expr); while (scanf("%s", s) != EOF) { if (is_error(s)) { printf("ERROR"); return 0; } c[i++] = get_val(s[0]); } i = is_24(table, size, c); if (i> 0) { v = table[i]; for (j = 0, n = 0; j < 4; j++) { k = (v >> 4 * (3 - j)) & 0xf; s[n++] = cvt[k]; if (k == 10) { s[n++] = '0'; } s[n++] = e[(expr[i] >> 2 * (2 - j)) & 0x3]; //check '*' } s[n - 1] = 0; printf(s); } else { printf("NONE"); } return 0; }