201903-2 二十四点 100分 15ms

点击前往试题目录:https://blog.csdn.net/best335/article/details/99550556
在这里插入图片描述
这道题使用两个vector存储要计算的值和符号,然后计算出首先出现乘除的位置,然后计算结果,删掉值和符号,直到全部符号都计算过。

#include<iostream>
#include<vector>
using namespace std;
int calc(int& a,int& b,char& op){//计算 a op b
	switch(op){
		case '+':
			return a+b;
		case '-':
			return a-b;
		case '/'://对除0做特殊处理
			return b==0?-10000:(a/b);
	}
	return a*b;
}
int main(){
	int n,ans,idx;
	string s;
	cin>>n,cin.get();
	for(int i=0;i<n;++i){
		getline(cin,s);
		vector<int> v;//顺序存储要计算的值
		vector<char> c;//顺序存储要计算的符号
		for(int i=0;i<7;i+=2) v.emplace_back(s[i]-'0');
		for(int i=1;i<7;i+=2) c.emplace_back(s[i]);
		while(v.size()>1){//循环计算 直到所有的符号计算完毕
			for(int i=idx=0,ni=c.size();i<ni;++i,++idx) if(c[i]=='x'||c[i]=='/') break;//找到第一个优先的符号
			if(idx==c.size()) idx=0;//如果都为-+
			v[idx]=calc(v[idx],v[idx+1],c[idx]),v.erase(v.begin()+idx+1),c.erase(c.begin()+idx);//计算结果 清除值和符号
		}
		cout<<(v[0]==24?"Yes":"No")<<endl;
	}
	return 0;
}
/*
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
*/
发布了107 篇原创文章 · 获赞 21 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/best335/article/details/100111882
今日推荐