ccf考试前练手有感之 ccf24点

难受,练个第二题自闭了,丢脸,在想要不要给设成私密

太多细节没有考虑到

1.循环中的初始化(去死吧!!!还是出这个问题,当初学选择排序就知道这东西,脸都丢完了)

2.char的数据范围,竟然都没算一下,在样例就爆了,样例挺良心

3.数字经过计算可能和运算符号的ascii码相同,所以要把数字和运算符分开来

 

总之,每个语句都要把当下所有情况考虑到

 

二十四点是一款著名的纸牌游戏,其游戏的目标是使用 3 个加减乘除运算使得 4 张纸牌上数字的运算结果为 24。

定义每一个游戏由 4 个从 1−9 的数字和 3 个四则运算符组成,保证四则运算符将数字两两隔开,不存在括号和其他字符,运算顺序按照四则运算顺序进行。

其中加法用符号 + 表示,减法用符号 - 表示,乘法用小写字母 x 表示,除法用符号 / 表示。

在游戏里除法为整除(向下取整),例如 2/3=0,3/2=1,4/2=2,−3/7=−12/3=0,3/2=1,4/2=2,−3/7=−1。

老师给了你 nn 个游戏的解,请你编写程序验证每个游戏的结果是否为 2424。

输入格式

第一行输入一个整数 n。

从第 2 行开始到第 n+1 行中,每一行包含一个长度为 7 的字符串,为上述的 24 点游戏,保证数据格式合法。

输出格式

包含 n 行,对于每一个游戏,如果其结果为 24 则输出字符串 Yes,否则输出字符串 No

#include<bits/stdc++.h>
#define go(i,a,b) for(int i=a;i<=b;++i)
#define ll long long
using namespace std;
char s[20];
int stackk[20];
int tail;
void push_backk(){
    tail=0;
    go(i,0,7){
        if(

           tail>=1
           &&(stackk[tail]=='x'||stackk[tail]=='/')
           &&i%2==0
           ){

            if(stackk[tail]=='x'){
                --tail;
                stackk[tail]=(stackk[tail]-48)*int(s[i]-48)+48;

            }

            else{
                --tail;
                stackk[tail]=(stackk[tail]-48)/(s[i]-48)+48;

            }
        }
        else{
            stackk[++tail]=s[i];

        }//printf("%d\n", stackk[tail]-48);

    }


}


void addsub(){
int ans=stackk[1]-48;
for(int i=3;i<=tail;i+=2){
    if(stackk[i-1]=='+')
        ans+=(stackk[i]-48);
    else
        ans-=(stackk[i]-48);

}

if(ans==24)
    printf("Yes\n");
else
    printf("No\n");

}

int main(){
//cout<<int('/')<<int('x');
int n;
cin>>n;
++n;
while(--n){
    scanf("%s",s);
    push_backk();
    addsub();

}



return 0;
}

 

上一篇:字符串转数字的算法


下一篇:48-裂纹尖端的小范围屈服