CCF-CSP 201903-2二十四点 三种方法 满分题解 结尾附惊天方法
题目链接:CCF-CSP 201903-2二十四点
方法一思路:
1.通读题意,发现该表达式仅由4个数字和3个四则运算组成,即长度为7。
2.利用栈”先进先出”的特性,设置一个数字栈,将数字保存在栈里。
3.利用一些基本的数学知识进行转化:将减法转换成加法。
4.直接计算乘法和除法,将所得结果压入栈中。
5.细节:在x和/后接的一个数字可以直接用(运算优先性),但是符号前面的一个数字需要通过栈来给出。==举例:==5x6/5x4:在计算/时,不能直接用6/5来进行计算,必须用栈顶元素30来进行计算。
方法一代码如下:(结尾附样例)
#includeusing namespace std; bool Jude(char a[]) { bool flag=false; stack p;//数字栈 int i=0; while(i<7)//观察可得,每个表达式的长度都为7 { if(a[i]>='1'&&a[i]<='9') { p.push(a[i]-'0'); i++;//将数字进栈 } else if(a[i]=='+') { i++;//跳过 } else if(a[i]=='-') { //将-转换成+ p.push((a[i+1]-'0')*(-1));//将数字进栈 i=i+2;//由于后一数字已经操作,跳过此数字 } else if(a[i]=='x') { int sum=0; int temp=p.top(); p.pop(); sum=(a[i+1]-'0')*temp;//处理乘法 i=i+2;//连同后一数字一起处理 p.push(sum);//将乘法所得结果进栈 } else if(a[i]=='/') { int sum=0; int temp=p.top(); p.pop(); sum=(temp/(a[i+1]-'0'));//处理除法 i=i+2;//连同后一数字一起处理 p.push(sum);//将除法所得结果进栈 } } int sum=0; while(p.empty()==false)//通过栈p来判断 { sum+=p.top(); p.pop(); } if(sum==24)flag=true; else flag=false; return flag; } int main() { int n;cin>>n; for(int i=1;i<=n;i++) { char a[8]; cin>>a; if(Jude(a)) { cout<<"Yes"<
方法二思路:
1.通读题意,发现该表达式仅由4个数字和3个四则运算组成,即长度为7。
2.可以判断运算符在字符串中的位置,也可以判断出数字在字符串中的位置。
3.利用数字和字符的位置直接进行运算。
方法二代码如下:(结尾附样例)
#includeusing namespace std; int judge(char s[]) { int a[4], i, j; char op[3]; //从输入取出数和运算符 for(i = 0; i < 4; i++) a[i] = s[i * 2] - '0'; for(i = 0; i < 3; i++) op[i] = s[i * 2 + 1]; int k = 3; // 先计算乘和除 for(i = 0; i < k; i++) if(op[i] == 'x' || op[i] == '/') { if(op[i] == 'x') a[i] = a[i] * a[i + 1]; else a[i] = a[i] / a[i + 1]; for(j = i + 1; j < k; j++) { op[j - 1] = op[j]; a[j] = a[j + 1]; } k--, i--; } //再计算加和减 int ans = a[0]; for(i = 0; i < k; i++) if(op[i] == '+') { ans = a[i] + a[i + 1]; a[i + 1] = ans; } else { ans = a[i] - a[i + 1]; a[i + 1] = ans; } return ans == 24; } int main(void) { int n;cin>>n; char s[8]; while(n--) { cin>>s; if(judge(s)) { cout<<"Yes"<
方法三思路:
1.对表达式进行预处理,将’x’转换成’*’,’/‘转换成’//’。
利用Python语言中的eval()函数对表达式进行求值。
方法三代码如下:(结尾附样例)
n = int(input()) for i in range(n): s = input().replace('x', '*').replace('/', '//') print("Yes" if eval(s) == 24 else "No") //样例1输入 //10 //9+3+4x3 //5+4x5x5 //7-9-9+8 //5x6/5x4 //3+5+7+9 //1x1+9-9 //1x9-5/9 //8/5+6x9 //6x7-3x6 //6x4+4/5谁能想到Python用四行就能解决CCF-CSP第二题呢!!!



