自学内容网 自学内容网

【CSP CCF记录】201903-2第16次认证 二十四点

题目

样例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

样例1输出

Yes
No
No
Yes
Yes
No
No
No
Yes
Yes

样例1解释

思路

参考:CCF小白刷题之路---201903-2 二十四点(C/C++ 100分)_ccf认证小白-CSDN博客

(自己写了好几种,发现还是这个最清晰易懂)

本题关键:

  • 字符转数字、字符转运算符
  • 先乘除、后加减

用num和op两个vector分别存储数字和运算符。

第一个for循环进行乘除运算;第二个for循环进行加减运算。

每次运算后,将已经使用过的数字和运算符从容器中删除,需要j--,以防漏算。

可以通过手算改进代码细节。以下以9+3+4x3为例,进行了手算,方便理解。

其他知识点: erase的用法

代码

#include<bits/stdc++.h>
using namespace std;

int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
string a; 
cin>>a;
vector<int> num;//存放数字
vector<char> op;//存放运算符

for(int j=0;j<a.length();j++) 
{
if(a[j]>='0' && a[j]<='9') num.push_back(a[j]-'0');
            else op.push_back(a[j]);
}
int j=0;
for(int j=0; j<op.size();j++)
{
if(op[j]=='x')
{
num[j]=num[j]*num[j+1];
num.erase(num.begin() + j + 1);
op.erase(op.begin() + j);
j=-1;

}
if(op[j]=='/')
{
num[j]=num[j]/num[j+1];
num.erase(num.begin() + j + 1);
op.erase(op.begin() + j);
j=-1;
}
}
j=0;
for(int j=0; j<op.size();j++)
{
if(op[j]=='+')
{
num[j]=num[j]+num[j+1];
num.erase(num.begin() + j + 1);
op.erase(op.begin() + j);
j=-1;
}
if(op[j]=='-')
{
num[j]=num[j]-num[j+1];
    num.erase(num.begin() + j + 1);
op.erase(op.begin() + j);
j=-1;
}
}
if(num[0]==24)
{
cout<<"Yes"<<endl;
 } 
 else
 {
 cout<<"No"<<endl;
 }
}
return 0;
}

运行

因为csp练习系统很坏地改版了,所以只能用所给样例运行一下。


原文地址:https://blog.csdn.net/m0_73733846/article/details/143994875

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!