题解 | #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; }