试题编号: 201912-3
试题名称: 化学方程式
时间限制: 1.0s
内存限制: 512.0MB
问题描述:
解题思想:
1.先忽略带括号的特殊形式,保证拿到一部分的分数
2.首先找到‘=’的位置,将等式分为左右两边进行计算
3.当计算左边时,以‘+’为分界点,考虑到大小写字母为一个元素的情况,例如最后一个测试用例,存储元素个数时,借助数组,下标为该字母转化十进制整数的形式,注意累加。右边同理
4.两边进行比较,得出结果。
#include<iostream>
#include<cstring>
using namespace std;
const int N = 10000;
char c[N];
int a[N];
int b[N];
bool isNum(int i){
if(c[i] >= '0' && c[i] <= '9'){
return 1;
}
return 0;
}
bool isLow(int i){
if(c[i] >= 'a' && c[i] <= 'z'){
return 1;
}
return 0;
}
bool isUp(int i){
if(c[i] >= 'A' && c[i] <= 'Z'){
return 1;
}
return 0;
}
void jisuan(int *p,int start,int end,int xs){
int j = start;
while(j <= end){
int x,y;
if(j+1 <= end && isLow(j+1)){//Ca这种形式
x = (c[j] - 'A' + 1) * 26 + (c[j+1] - 'a');
y = j+2;
}else{//CH4类似这种形式
x = c[j] - 'A';
y = j+1;
}
int tz = 0;
while(y <= end && isNum(y)){//得出下标数
tz = tz*10 + c[y] - '0';
y++;
}
if(!tz) tz = 1;
p[x] += xs*tz;//当左边有两个 Ca时,就要将个数累加在一起
j = y;
}
return;
}
int main(){
int n,len;
cin >> n;
for(int i = 0; i < n; i++){
cin >> c;
len = strlen(c);
for(int i = 0; i < N; i++){
a[i] = 0;
b[i] = 0;
}
int mid = 0;
for(int j = 0;; j++){
if(c[j] == '='){
mid = j;
break;
}
}
int v = 0;
while(v < mid){//处理等号左边
int xs = 0;
int start,end;
while(isNum(v)){//若有系数
xs = xs*10+c[v]-'0';
v++;
}
if(!xs) xs = 1;
//确定起始位置和终止位置
start = v;
while(v < mid && c[v] != '+'){
v++;
}
end = v-1;
jisuan(a,start,end,xs);
v++;
}
while(v < len){//处理等号右边
int xs = 0;
int start,end;
while(isNum(v)){//若有系数
xs = xs*10+c[v]-'0';
v++;
}
if(!xs) xs = 1;
//确定起始位置
start = v;
while(v < len && c[v] != '+'){
v++;
}
end = v-1;
jisuan(b,start,end,xs);
v++;
}
int flag = 0;
for(int i = 0; i < N; i++){
if(a[i] != b[i]){
flag = 1;
break;
}
}
if(flag){
cout << "N" << endl;
}else{
cout << "Y" << endl;
}
}
return 0;
}