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

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务