计算器的改良(NOIP2000)
题目链接:计算器的改良
这道题,不是很难,但代码也短不到哪去。
我们这里决定采取边读入边计算的方法,因为题目没有明确说式子有多长。
我们需要计算什么?
我们需要知道等号两边未知数的系数和常数项即可。
那么我们就要分五种情况去处理:
数字,加号,减号,等号和未知数。
今天我们先看代码,我再来讲思路。
#include<bits/stdc++.h>
using namespace std;
int main(){
char c; //用于读入字符
int lxs=0,rxs=0; //未知数左边系数和右边系数
int lcs=0,rcs=0; //左边常数和右边常数
int lor=0; //在左边还是右边的标识符
int num=0; //用于保存当前操作数
int opera=0; //操作标识符(0是加,1是减)//1
char x; //保存未知数
while(scanf("%c",&c)!=EOF){ //每次读入一个字符
if(c>='0'&&c<='9'){ //如果是数字
num=num*10+c-'0'; //2
}else if(c=='+'){ //如果是加号
if(lor==0){ //判断是在等号左边还是右边
if(opera==0){ //判断操作标识符
lcs+=num;
}else{
lcs-=num;
}
}else{
if(opera==0){
rcs+=num;
}else{
rcs-=num;
}
}
num=0; //操作数设置为0
opera=0;
}else if(c=='-'){
if(lor==0){
if(opera==0){
lcs+=num;
}else{
lcs-=num;
}
}else{
if(opera==0){
rcs+=num;
}else{
rcs-=num;
}
}
num=0;
opera=1;
}else if(c=='='){
if(lor==0){
if(opera==0){
lcs+=num;
}else{
lcs-=num;
}
}else{
if(opera==0){
rcs+=num;
}else{
rcs-=num;
}
}
num=0;
opera=0;
lor=1; //转变等式方位
}else if(c>='a'&&c<='z'){ //如果是字母
x=c; //保存未知数
if(num==0){
num=1;
}
if(lor==0){
if(opera==0){
lxs+=num;
}else{
lxs-=num;
}
}else{
if(opera==0){
rxs+=num;
}else{
rxs-=num;
}
}
num=0;
}
}
if(num!=0){ //3
if(opera==0){
rcs+=num;
}else{
rcs-=num;
}
}
double ans=(double)(rcs-lcs)/(double)(lxs-rxs);
if(ans==0.0){ //4
ans=abs(ans);
}
printf("%c=%.3f",x,ans); //5
return 0;
}
这里我主要讲一下每一种情况的操作是为什么。
首先遇到数字,我们就将他保存在操作数,为什么不操作?因为我们只读了一个数字,不能确保后面没有数字,而他们是同一个数,所以我们只把新读的数字加到操作数的末尾。
遇到加减时,如果操作数为0,那么操作一次也没影响,但如果操作数不为0,那么说明这肯定时个常数,因为如果是未知数的系数,那么会在读到未知数时进行操作,并被置为0,所以我们只要将对应的常数进行操作就行了,然后设置一下操作标识符。
遇到等于号时,和加减一个意思,只是要将lor该为1,表明进入等式右边。
遇到未知数,第一步,保存下来,为了后面的输出。第二步,系数操作,因为这一定时未知数前的系数。
最后出循环时,还需要判断一下num是不是0,如果不是0,说明式子末尾的常数未操作,因为他后面没有任何字符,所以再判断一下。
这就是设计思路。
下面,我就5个点给大家讲讲:
1处:操作默认是加,因为如果第一个数是负的,那么一定会读到一个减号,转变就行了。
2处:将每个数字加到末尾
3处:好像讲过了,那就算了。
4处:这一步很关键,因为c++有个缺陷,就是说,他认为0除以一个负数为-0,那么输出的时候就会出问题,比如洛谷最后一个测试点,所以我们要取的绝对值。
5处:注意输出的格式。
计算器的改良(NOIP2000)的更多相关文章
- luogu1022计算器的改良[noip2000提高组Day1 T1]
题目背景 NCL是一家专门从事计算器改良与升级的实验室,最近该实验室收到了某公司所委托的一个任务:需要在该公司某型号的计算器上加上解一元一次方程的功能.实验室将这个任务交给了一个刚进入的新手ZL先生. ...
- 【00NOIP普及组】计算器的改良(信息学奥赛一本通 1910)(洛谷 1022)
[题目描述] NCL是一家专门从事计算器改良与升级的实验室,最近该实验室收到了某公司所委托的一个任务:需要在该公司某型号的计算器上加上解一元一次方程的功能.实验室将这个任务交给了一个刚进入的新手ZL先 ...
- P1022 计算器的改良
P1022 计算器的改良 题目背景 NCL 是一家专门从事计算器改良与升级的实验室,最近该实验室收到了某公司所委托的一个任务:需要在该公司某型号的计算器上加上解一元一次方程的功能.实验室将这个任务交给 ...
- 洛谷—— P1022 计算器的改良
P1022 计算器的改良 题目背景 NCL是一家专门从事计算器改良与升级的实验室,最近该实验室收到了某公司所委托的一个任务:需要在该公司某型号的计算器上加上解一元一次方程的功能.实验室将这个任务交给了 ...
- 洛谷P1022 计算器的改良
P1022 计算器的改良 题目背景 NCL是一家专门从事计算器改良与升级的实验室,最近该实验室收到了某公司所委托的一个任务:需要在该公司某型号的计算器上加上解一元一次方程的功能.实验室将这个任务交给了 ...
- P1010 幂次方 P1022 计算器的改良
P1010 幂次方 一.题目 https://www.luogu.org/problemnew/show/P1010 二.代码 #include<bits/stdc++.h> using ...
- 2021.07.26 P1022 计算器的改良(字符串)
2021.07.26 P1022 计算器的改良(字符串) 改进: 如果是我出题,我一定把未知数设为ab.buh.bluesky之类的长度不只是1的字符串! 题意: 一个一元一次方程,求解. 分析: 1 ...
- [NOIP2000] 提高组 洛谷P1022 计算器的改良
题目背景 NCL是一家专门从事计算器改良与升级的实验室,最近该实验室收到了某公司所委托的一个任务:需要在该公司某型号的计算器上加上解一元一次方程的功能.实验室将这个任务交给了一个刚进入的新手ZL先生. ...
- NOIP2000普及组 T1计算器的改良
主要考字符串处理,把等式从等号中间断开,左边的区域为left,右边的区域为right. 开四个数组分别用来存储区域left和right中未知数的系数,区域left和right中的常数 先处理区域lef ...
随机推荐
- 五 shutil模块
高级的 文件.文件夹.压缩包 处理模块 shutil.copyfileobj(fsrc, fdst[, length])将文件内容拷贝到另一个文件中 1 import shutil 2 3 shuti ...
- opencv: Rotate image by 90, 180 or 270 degrees
opencv2: void rotate_cw(const cv::Mat& image, cv::Mat& dest, int degrees) { ) { : dest = ima ...
- P3796 【模板】AC自动机(加强版)
P3796 [模板]AC自动机(加强版) https://www.luogu.org/problemnew/show/P3796 题目描述 有NN个由小写字母组成的模式串以及一个文本串TT.每个模式串 ...
- Linux防火墙操作
从配置菜单关闭防火墙是不起作用的,索性在安装的时候就不要装防火墙. 查看防火墙状态: /etc/init.d/iptables status暂时关闭防火墙: /etc/init.d/iptables ...
- mysql5.7 生成列 generated column
生成列的值是根据列定义中的表达式计算得出的. mysql5.7支持两种类型的生成列: 1.virtual 生成列:当从表中读取记录时,才计算该列值.不会把数据持久化在硬盘上. 2.stored 生成列 ...
- sql:inner join,left join,right join,full join用法及区别
join的语法: select [字段] from [表名1] inner/left/right/full join [表名2] on [表名1.字段1] <关系运算符> [表名2.字段2 ...
- python collections 里面的Counter 统计所有出现的字符数量
from collections import Counter c_num = Counter('Hello world') # 统计出现的每个字符数量print(c_num) for key, va ...
- Linux pip安装使用详解
简介 pip是Python有它自己的包管理工具,与yum和apt-get相似. 安装步骤: 1.下载get-pip.py:https://bootstrap.pypa.io/get-pip.py 2. ...
- (转)OOP(面向对象编程)的几大原则
文章转载自:http://blog.csdn.net/anders_zhuo/article/details/8949566 设计模式遵循的一般原则: 1.开-闭原则(Open-Closed Prin ...
- 8Q - 献给杭电五十周年校庆的礼物
我不能参赛,就送给学校一个DOOM III球形大蛋糕吧.等一等,吃蛋糕之前先考大家一个问题:如果校长大人在蛋糕上切了N刀(校长刀法极好,每一刀都是一个绝对的平面),最多可以把这个球形蛋糕切成几块呢? ...