题解 | #24点运算#
24点运算
https://www.nowcoder.com/practice/7e124483271e4c979a82eb2956544f9d
#include <stdio.h>
#include <string.h>
// 符号字典
char op[4]={'+','-','*','/'};
// 基础计算
int cal(int a, int b, int op) {
if (op==0) return a+b;
else if (op==1) return a-b;
else if (op==2) return a*b;
else if (op==3) return a/b;
else return 65535;
}
// // 最终综合计算
// int OutCal(int nums[4], int sign[3], int priority[3]) {
// if (priority[1]>priority[0]) {
// if (priority[2]>priority[0]) {
// return cal(nums[0], cal(cal(nums[1], nums[2], sign[1]), nums[3], sign[2]), sign[0]);
// } else {
// return cal(cal(nums[0], cal(nums[1], nums[2], sign[1]), sign[0]), nums[3], sign[2]);
// }
// }
// else if (priority[2]>priority[0]) {
// return cal(cal(nums[0], nums[1], sign[0]), cal(nums[2], nums[3], sign[2]), sign[1]);
// }
// else {
// if (priority[0]>priority[1] && priority[1]<priority[2]) {
// return cal(cal(nums[0], nums[1], sign[0]), cal(nums[2], nums[3], sign[2]), sign[1]);
// }
// else {
// return cal(cal(cal(nums[0], nums[1], sign[0]), nums[2], sign[1]), nums[3], sign[2]);
// }
// }
// } // 什么破题目!不加括号就不加括号,你连基本的计算规则也不考虑了吗???乘除法优先啊,搞什么!!
// 最终综合计算
int OutCal(int nums[4], int sign[3], int priority[3]) {
return cal(cal(cal(nums[0],nums[1],sign[0]),nums[2],sign[1]),nums[3],sign[2]);
}
// 主函数
int main() {
char str[100]={0};
while (scanf("%[^\n]\n",str)!=EOF) {
/* 提取數字 */
// printf("%s\n",str);
int nums[4]={0}, len=strlen(str), index=0, jokerflag=0;
for (int i=0; i<len; i++) {
if (str[i]==' ') continue;
if (str[i]>='2' && str[i]<='9') {
nums[index++] = str[i]-'0';
}
else if (str[i]=='1') {
nums[index++] = 10;
i++;
}
else if (str[i]=='Q') nums[index++]=12;
else if (str[i]=='K') nums[index++]=13;
else if (str[i]=='A') nums[index++]=1;
else if (str[i]=='j') {
jokerflag =1; break;
}
else {
if (i==len-1 || str[i+1]==' ') {
// i==len-1表示是最后一个字符,与str[i+1]等于空格都表示单纯一个J、而不是JOKER
nums[index++] = 11;
} else {
jokerflag=1; break;
}
}
}
if (jokerflag==1) {
printf("ERROR\n"); continue;
}
/* 運算 */
int sign[3]={0}, priority[3]={0}, i, j, k, num_count=4, output, OKflag=0, a, b, c, d, input[4]={0};
for (i=0; i<4; i++) { // 0:+ 1:- 2:* 3:/
sign[0] = i;
priority[0] = (i>1?1:0);
for (j=0; j<4; j++) {
sign[1] = j;
priority[1] = (j>1?1:0);
for (k=0; k<4; k++) {
sign[2] = k;
priority[2] = (k>1?1:0);
for (a=0; a<4; a++) {
for (b=0; b<4; b++) {
if (b==a) continue;
for (c=0; c<4; c++) {
if (c==b || c==a) continue;
for (d=0; d<4; d++) {
if (d==a || d==b || d==c) continue;
input[0]=nums[a];
input[1]=nums[b];
input[2]=nums[c];
input[3]=nums[d];
if (OutCal(input, sign, priority)==24) {
OKflag=1;
// printf("op=%c%c%c\n",op[sign[0]],op[sign[1]],op[sign[2]]);
break;
} else continue;
}
if(OKflag) break;
}
if(OKflag) break;
}
if(OKflag) break;
}
if(OKflag) break;
}
if(OKflag) break;
}
if (OKflag) break;
}
if (OKflag) {
// printf("%d%c%d%c%d%c%d\n",input[0],op[sign[0]],input[1],op[sign[1]],input[2],op[sign[2]],input[3]);
for (i=0; i<4; i++) {
if (input[i]==1) printf("A");
else if (input[i]>=2 && input[i]<=10) printf("%d",input[i]);
else if (input[i]==11) printf("J");
else if (input[i]==12) printf("Q");
else if (input[i]==13) printf("K");
else printf("ErrorOne ");
if (i<3) printf("%c",op[sign[i]]);
else printf("\n");
}
} else {
printf("NONE\n");
}
}
return 0;
}

