河南第八届省赛(挑战密室)

题目地址:点击打开链接

思路:调了3,4个小时才调出来,还是菜啊,各种细节基础问题出错,刚开始想着短一点,不枚举,后来快写完了才发现括号没考虑,后来想着括号里和括号外用同一个函数调用,懒得想了,直接爆吧,但是还得考虑括号外的数字,还得考虑整个式子前面的数字,剩下的就是最伤心的部分了,每次用的都是一个数组结果却用strlen求值,然后函数调用,结果数组的值就是不对,结果你懂的,后来数组的长度虽然对了,结果if-else语句控制的下标超出求的长度导致wrong,后来就在if语句里面又加一个判断条件,还有就是getchar()放到while语句里wrong了几发

AC代码:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <cstring>
#include <climits>
#include <cmath>
#include <cctype>

using namespace std;

char a[55];
char b[55];
char c[55];

int qiu(char b[],int m)
{
    int i;
    int sum1 = 0,sum;
    for(i=0; i<m; i++)
    {
        sum = 0;
        if(b[i] == 'C' && b[i+1] == 'l')
        {
            sum += 35;
            if(b[i+2] >='0' && b[i+2] <= '9' && i + 2 < m)//怕超出界限
            {
                sum *= (b[i+2] - '0');
                i = i + 2;
            }
            else
            {
                i = i + 1;
            }
        }
        else if(b[i] == 'A' && b[i+1] == 'l')
        {
            sum += 27;
            if(b[i+2] >='0' && b[i+2] <= '9' && i + 2 < m)
            {
                sum *= (b[i+2] - '0');
                i = i + 2;
            }
            else
            {
                i = i + 1;
            }
        }
        else if(b[i] == 'C' && b[i+1] == 'a')
        {
            sum += 40;
            if(b[i+2] >='0' && b[i+2] <= '9' && i + 2 < m)
            {
                sum *= (b[i+2] - '0');
                i = i + 2;
            }
            else
            {
                i = i + 1;
            }
        }
        else if(b[i] == 'Z' && b[i+1] == 'n')
        {
            sum += 65;
            if(b[i+2] >='0' && b[i+2] <= '9' && i + 2 < m)
            {
                sum *= (b[i+2] - '0');
                i = i + 2;
            }
            else
            {
                i = i + 1;
            }
        }
        else if(b[i] == 'N' && b[i+1] == 'a')
        {
            sum += 23;
            if(b[i+2] >='0' && b[i+2] <= '9' && i + 2 < m)
            {
                sum *= (b[i+2] - '0');
                i = i + 2;
            }
            else
            {
                i = i + 1;
            }
        }
        else if(b[i] == 'N')
        {
            sum += 14;
            if((b[i+1] >= '0' && b[i+1] <= '9') && i + 1 < m)
            {
                sum *= (b[i+1] - '0');
                i = i + 1;
            }
        }
        else if(b[i] == 'C')
        {
            sum += 12;
            if((b[i+1] >= '0' && b[i+1] <= '9') && i + 1 < m)
            {
                sum *= (b[i+1] - '0');
                i = i + 1;
            }
        }
        else if(b[i] == 'O')
        {
            sum += 16;
            if((b[i+1] >= '0' && b[i+1] <= '9') && i + 1 < m)
            {
                sum *= (b[i+1] - '0');
                i = i + 1;
            }
        }
        else if(b[i] == 'S')
        {
            sum += 32;
            if((b[i+1] >= '0' && b[i+1] <= '9') && i + 1 < m)
            {
                sum *= (b[i+1] - '0');
                i = i + 1;
            }
        }
        else if(b[i] == 'H')
        {
            sum += 2;
            if((b[i+1] >= '0' && b[i+1] <= '9') && i + 1 < m)
            {
                sum *= (b[i+1] - '0');
                i = i + 1;
            }
        }
        sum1 += sum;
    }
    return sum1;
}


int main()
{
    int i,j,k;
    int t;
    int cheng;
    scanf("%d",&t);
    getchar();//放到这里别放到while里面
    while(t--)
    {
        cheng = 1;
        gets(a);
        int n = strlen(a);
        k = 0;
        for(i=0; i<n; i++)
        {
            if(a[i] == '=')
            {
                for(j=i+1; j<n; j++)
                {
                    if(a[j] == '+')
                    break;
                    b[k++] = a[j];
                }
                break;
            }
        }//把括号和加号里面的字符串截出来
        int sum = 0,sum1;
        int m = k;
        for(i=0; i<m; i++)
        {
            if(b[i] == '(')
            {
                sum1 = 0;
                k = 0;
                for(j=i+1; j<m; j++)
                {
                    if(b[j] == ')')
                        break;
                    c[k++] = b[j];
                }
                sum1 = qiu(c,k);
                j++;
                if(b[j] >= '0' && b[j] <='9')
                    sum1 *= (b[j] - '0');
                sum += sum1;
            }
        }//加上括号里面的值
        if(b[0] >= '0' && b[0] <= '9')
        {
            cheng = b[0] - '0';
            i = 1;
        }
        else
        {
            i = 0;
        }
        k = 0;//判断第一个是否为数字
        for(; i<m; i++)
        {
            if(b[i] == '(')
            {
                i++;
                while(1)
                {
                    if(b[i] == ')')
                        break;
                    i++;
                }
                if(b[i+1] >= '0' && b[i+1] <= '9')
                    i += 1;
            }
            else
            {
                c[k++] = b[i];
            }
        }//加上括号外面的值
        sum += qiu(c,k);
        sum *= cheng;
        printf("%04d\n",sum);
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值