CCF-CSP题解 201912-3化学方程式
化学方程式的配平检验
第一次去考,有些紧张,第三题本来很简单的,愣是没写出来,放假了有空写了写,自我感觉可读性还可以。
因为ccf官网上还没有开放模拟,我就自己写了个.txt文件检验一下,基本要求都满足了。
主要用了unordered_map作为元素记录,stringstream作为字符串分割工具。
提示
经过大佬提示,尽量用面向过程的思想,少用class。
更新
增加了嵌套括号的判断(增加了一个vector数组,记录每层括号外的数字)运行截图如下:
#include <iostream>
#include <string>
#include <vector>
#include <unordered_map>
#include <sstream>using namespace std;class elements{private:unordered_map<string, int> record; // 记录元素个数vector<int> stack; // 记录嵌套括号外的数字bool islower(char& c){return c >= 'a' && c <= 'z';}bool isdigit(char& c){return c >= '0' && c <= '9';}
public:elements(vector<string> words){stack.push_back(1);int times = 1; // 记录当前的元素需要乘的倍数// int outsideNum = 1; // 括号外的数字(现改为局部变量)int inside = 0; // 记录括号嵌套的层次int totalNum = 0; // 化学式的系数for(auto word : words){for(int i = 0; i < word.size() && isdigit(word[i]); i++){ // 获取化学式的系数totalNum = totalNum * 10 + word[i] - '0';}if(totalNum == 0) // 没有系数则默认为1totalNum = 1;for(int i = word.size() - 1; i >= 0; i--){char curch = word[i];if(isdigit(curch)){// times = curch - '0'; // 之前的写法缺少对括号外多位数字的判断,经评论区兄弟提醒,现做订正times = curch - '0';int tc = 1;while (i > 0 && isdigit(word[i - 1])) {times += (word[i-1] - '0') * pow(10, tc);tc++;i--;}if(word[i - 1] == ')'){ // 出现的数字属于括号内的元素// outsideNum = times;if(inside == 0){ // 如果还没有嵌套,目前仅出现了单层括号stack.pop_back();}stack.push_back(times);times = 1;}} else if (curch == ')'){inside++;} else if (curch == '('){inside--;// outsideNum = 1;stack.pop_back();if(inside == 0){stack.push_back(1);}} else if (islower(curch)){string temp_ele;temp_ele.push_back(word[i - 1]);temp_ele.push_back(curch);int outsideNum = 1;for(auto n : stack){outsideNum *= n;}record[temp_ele] += times * outsideNum * totalNum;times = 1;i--;} else { // 单个的元素string temp_ele;temp_ele.push_back(curch);int outsideNum = 1;for(auto n : stack){outsideNum *= n;}record[temp_ele] += times * outsideNum * totalNum;times = 1;}}totalNum = 0; // 记得清零,对下一个化学式判断times = 1;}for(const auto& r : record){cout << r.first << " : " << r.second << endl;}}int operator[](string elem){return record[elem];}bool operator==(elements& rightElement){for(const auto& r : record){if(r.second != rightElement[r.first])return false;}return true;}
};bool isbalance(string input){vector<string> leftwords;vector<string> rightwords;std::stringstream ss(input);vector<string> line;string temp;while(getline(ss, temp, '=')){ // 把整个表达式分为左右两个部分line.push_back(temp);}ss = stringstream(line[0]);while(getline(ss, temp, '+')){leftwords.push_back(temp);}ss = stringstream(line[1]);while(getline(ss, temp, '+')){rightwords.push_back(temp);}cout << "the left elements number:\n";elements left(leftwords);cout << "the right elements number:\n";elements right(rightwords);return left == right;
}int main()
{int equanum;cin >> equanum;string result;for(int i = 0; i < equanum; i++){string input;cin >> input;bool res = isbalance(input);result.push_back(res?'Y':'N');}for(auto c : result)cout << c << endl;return 0;
}
运行截图(最后的两个Y是判断的结果)
CCF-CSP题解 201912-3化学方程式相关推荐
- CCF CSP 题解汇总
前言 本文汇总了本人所有的CSP题解,方便总览. 202209 202209 题解 分数 1 如此编码 1 如此编码 100 2 何以包邮? 2 何以包邮? 100 3 防疫大数据 4 吉祥物投票 4 ...
- CCF CSP认证考试题解目录
由于本人的书籍<算法详解(C++11 语言描述)>已经出版,为了降低题解的维护难度,有关CCF CSP考试的所有题解的更新将全部在书籍的配套仓库进行,CSDN博客中不再进行任何题解的更新. ...
- CCF CSP认证历年真题 满分代码(持续更新中)
目标 在接下来的半年到一年时间内,补全CCF认证历年真题(A-D)的满分代码(E题随缘). 考虑到CCF认证这个东西是可以混分的,我计划对D.E题额外增加部分分代码,或许有助于不同层次的选手备赛. 除 ...
- CCF CSP认证菜鸟刷题日志
CCF CSP菜鸟刷题日志(c/c++) 本萌新写给自己看的,要是有大佬路过,请多多指教orz 立个flag:每日一更,至201903 9月15ccf csp,冲鸭! 今天(2019.8.18)起每天 ...
- ccf csp认证考试的历年题集汇总
1.CCF历年试题解答_按题序 2.CCF认证考试题解目录 3.CCF CSP入坑指南 4.ccf 认证历年试题解答 5.CCF认证历年真题 _无题意 6.CCF-CSP认证备考要点 6.CCF认证历 ...
- CCF CSP 201609-2 火车购票
题目链接:http://118.190.20.162/view.page?gpid=T46 问题描述 请实现一个铁路购票系统的简单座位分配算法,来处理一节车厢的座位分配. 假设一节车厢有20排.每一排 ...
- 计算机能力挑战赛_蓝桥杯、PAT、CCF CSP、团体程序设计天梯赛、传智杯、计算机能力挑战赛、软考等大学生编程比赛/考试介绍...
介绍7个适合普通大学生参加的编程比赛/考试(注:有的比赛如蓝桥杯有多种赛别,本文仅介绍其中的程序设计/编程比赛). 编程入门书籍推荐<算法笔记>,内容详细易懂,对新手非常友好,描述语言为C ...
- 以CCF CSP认证为抓手,积极探索软件基础能力递进式培养体系
原文链接:以CCF CSP认证为抓手,积极探索软件基础能力递进式培养体系 发布单位:学会 发布时间:2017-01-20 16:16 作者:陆建峰 余立功 摘要:为提升计算机专业类学生 ...
- ccf csp寻宝!大冒险!(C语言)
ccf csp寻宝!大冒险! 题目背景 暑假要到了.可惜由于种种原因,小 P 原本的出游计划取消.失望的小 P 只能留在西西艾弗岛上度过一个略显单调的假期--直到-- 某天,小 P 获得了一张神秘的藏 ...
- 【CCF CSP】【Python】【201903-1】小中大
[CCF CSP][Python][201903-1] 小中大 题目要求 代码实现 主要方法 提交验证 题目要求 代码实现 1.初始版(又名完全原创版.欠优化版.无法体现"人生苦短,我用PY ...
最新文章
- ios app的真机调试与发布配置
- 64位处理器_电脑操作系统的32位和64位有什么区别
- 西安石油大学计算机基础考试试题,2017年西安石油大学计算机学院824计算机组成原理考研题库...
- r语言 fread函数参数_R语言 第4章 初级绘图(6)
- JS关键字和保留字汇总(小记)
- 数据仓库建模与ETL实践技巧
- 超好看的自适应蜘蛛池官网首页源码
- Java 找到并返回一组字符串中第一个不为空的字符串
- LeetCode 654 最大二叉树
- 2018网易校招前端笔试考后总结
- 线性代数知识荟萃(3)——行列式
- FileZilla Client 3.26.1 发布,FTP 解决方案
- 关于MPU6050姿态解算的一阶互补滤波方法(从原理到代码实现)
- Retinex低光照图像增强
- minigui学习笔记四
- 我的sulley安装过程
- 汉语属于哪个语系_汉语语族的所属语系
- 小程序如何开通微信支付?
- php 怎么远程包含,利用PHP应用程序中的远程文件包含(RFI)并绕过远程URL包含限制...
- 聊聊 Kafka:协调者 GroupCoordinator 源码剖析之 FIND_COORDINATOR