加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

HAUT1288 等价交换(大数+表达式求值,河南省多校连萌(七))

发布时间:2020-12-14 05:02:51 所属栏目:大数据 来源:网络整理
导读:题目: 1288: 等价交换 时间限制:?1 秒??内存限制:?128 MB 提交:?93??解决:?8 提交? 状态? 题目描述 爱德华和弟弟阿尔冯斯来自一个平行世界,在那个世界里炼金术是一门非常系统、严谨的科学。炼成阵其实就相当于化学方程式,也相当于炼成反应炉,而进行反应的

题目:

1288: 等价交换

时间限制:?1 秒??内存限制:?128 MB
提交:?93??解决:?8
提交? 状态?

题目描述

爱德华和弟弟阿尔冯斯来自一个平行世界,在那个世界里炼金术是一门非常系统、严谨的科学。炼成阵其实就相当于化学方程式,也相当于炼成反应炉,而进行反应的物质,则来自身边的环境,反应所需要的动力,来自自身的魔力以及大地之下数量众多的贤者之石。炼金术分为三个过程:物质的分析,物质的分解,物质的重组。既然要成为炼金术士,那么一定会对等式相当熟悉,在炼金术师资格考试上就有许多这样的题,只是资格考试,所以等式只有加法和乘法且没有括号,判断等式是否成立即可。

输入

输入包含多组,第一行是T<=40,代表数据组数。

之后T行,每行包括一组等式,长度不超过50,所有数字s满足0 <= s <= 10^9。

输出

对于每组等式,输出“Yes”代表正确或者“No”代表错误。

样例输入

3
1+1=2
135+342*292=99999
100000*100000=100000

样例输出

Yes
No

提示

来源

信息工程大学

状态?

思路:

没什么好说的,一定要注意细节,我debug了好长时间,原来是中缀转后缀的时候出错了。。尴尬

记得注意一下,等式两边都是表达式,而不是样例给的左边是表达式,右边是值。


代码:

#include <cstdio>
#include <cstring>
#include <cctype>
#include <string>
#include <set>
#include <iostream>
#include <map>
#include <stack>
#include <cmath>
#include <queue>
#include <vector>
#include <algorithm>
#define mem(a,b) memset(a,b,sizeof(a))
#define inf 0x3f3f3f3f
#define M 12357
#define ll long long
using namespace std;
string multi_string_int(string a,int k)
{
	if(k == 0) return "0";
	int len = a.length(),carry = 0;
	reverse(a.begin(),a.end());
	for(int i = 0; i < len; i++)
	{
		int s = (a[i] - '0') * k + carry;
		a[i] = s % 10 + '0';
		carry = s / 10;
	}
	while(carry != 0)
	{
		a = a + (char)(carry % 10 + '0');
		carry /= 10;
	}
	reverse(a.begin(),a.end());
	return a;
}
string add(string a,string b)
{
	string s;
	reverse(a.begin(),a.end());
	reverse(b.begin(),b.end());
	int i = 0;
	int m,k = 0;
	while(a[i] && b[i])
	{
		m = a[i] - '0' + b[i] - '0' + k;
		k = m / 10;
		s += (m % 10 + '0');
		i++;
	}
	if(i == a.size())
	{
		while(i != b.size())
		{
			m = k + b[i] - '0';
			k = m / 10;
			s += m % 10 + '0';
			i++;
		}
		if(k) s += k + '0';
	}
	else if(i == b.size())
	{
		while(i != a.size())
		{
			m = k + a[i] - '0';
			k = m / 10;
			s += m % 10 + '0';
			i++;
		}
		if(k) s += k + '0';
	}
	reverse(s.begin(),s.end());
	return s;
}
string multi_string_string(string a,string b)
{
	string ans = "";
	for(int i = a.size() - 1; i >= 0; i--)
	{
		string tmp = multi_string_int(b,a[i] - '0');
		for(int j = 0; j < a.size() - 1 - i; j++)
			tmp += '0';
		ans = add(ans,tmp);
	}
	return ans;
}
string init(string s)//中缀转后缀,传入中缀
{
	string ans="";
	stack<char>s1;//运算符栈
	map<char,int>mp;
	mp['+']=1;
	mp['*']=2;
	for(int i=0; i<s.length(); i++)
	{
		if(isdigit(s[i]))
		{
			while(isdigit(s[i]))
			{
				ans+=s[i];
				i++;
			}
			i--;
			ans+="#";
		}
		else
		{
			if(s1.empty())
			{
				s1.push(s[i]);
			}
			else
			{
				if(mp[s[i]]>=mp[s1.top()])
				{
					s1.push(s[i]);
				}
				else
				{
					while(!s1.empty()&&mp[s[i]]<mp[s1.top()])
					{
						ans+=s1.top();
						s1.pop();
					}
					s1.push(s[i]);
				}
			}
		}
	}
	while(!s1.empty())
	{
		ans+=s1.top();
		s1.pop();
	}
	return ans;
}
string calc(string s)//由后缀求结果
{
	stack<string>s1;//计算表达式
	string num="";
	for(int i=0; i<s.length(); i++)
	{
		if(isdigit(s[i]))
		{
			while(isdigit(s[i]))
			{
				num+=s[i];
				i++;
			}
			s1.push(num);
			num="";
		}
		else if(s[i]=='+')
		{
			string x=s1.top();
			s1.pop();
			string y=s1.top();
			s1.pop();
			string ans=add(x,y);
			if(ans[0]=='0')ans="0";
			s1.push(ans);
		}
		else if(s[i]=='*')
		{
			string x=s1.top();
			s1.pop();
			string y=s1.top();
			s1.pop();
			string ans=multi_string_string(x,y);
			if(ans[0]=='0')ans="0";
			s1.push(ans);
		}
	}
	return s1.top();
}

int main()
{
	int t;
	string str;
	cin>>t;
	while(t--)
	{
		string str1="",str2="";//两个等式
		int flag=1;
		cin>>str;
		for(int i=0; i<str.length(); i++)
		{
			if(flag)
			{
				if(str[i]=='=')
				{
					flag=0;
					continue;
				}
				str1+=str[i];
			}
			else
				str2+=str[i];
		}
		string ans1=calc(init(str1));
		string ans2=calc(init(str2));
		if(ans1==ans2)
			cout<<"Yes"<<endl;
		else
			cout<<"No"<<endl;
	}
	return 0;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读