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; }
标签:练手,24,stackk,48,int,游戏,tail,ccf,ccf24 来源: https://www.cnblogs.com/jiangbuyu/p/15640471.html