题目链接:计算器的改良

这道题,不是很难,但代码也短不到哪去。

我们这里决定采取边读入边计算的方法,因为题目没有明确说式子有多长。

我们需要计算什么?

我们需要知道等号两边未知数的系数和常数项即可。

那么我们就要分五种情况去处理:

数字,加号,减号,等号和未知数。

今天我们先看代码,我再来讲思路。

#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)的更多相关文章

  1. luogu1022计算器的改良[noip2000提高组Day1 T1]

    题目背景 NCL是一家专门从事计算器改良与升级的实验室,最近该实验室收到了某公司所委托的一个任务:需要在该公司某型号的计算器上加上解一元一次方程的功能.实验室将这个任务交给了一个刚进入的新手ZL先生. ...

  2. 【00NOIP普及组】计算器的改良(信息学奥赛一本通 1910)(洛谷 1022)

    [题目描述] NCL是一家专门从事计算器改良与升级的实验室,最近该实验室收到了某公司所委托的一个任务:需要在该公司某型号的计算器上加上解一元一次方程的功能.实验室将这个任务交给了一个刚进入的新手ZL先 ...

  3. P1022 计算器的改良

    P1022 计算器的改良 题目背景 NCL 是一家专门从事计算器改良与升级的实验室,最近该实验室收到了某公司所委托的一个任务:需要在该公司某型号的计算器上加上解一元一次方程的功能.实验室将这个任务交给 ...

  4. 洛谷—— P1022 计算器的改良

    P1022 计算器的改良 题目背景 NCL是一家专门从事计算器改良与升级的实验室,最近该实验室收到了某公司所委托的一个任务:需要在该公司某型号的计算器上加上解一元一次方程的功能.实验室将这个任务交给了 ...

  5. 洛谷P1022 计算器的改良

    P1022 计算器的改良 题目背景 NCL是一家专门从事计算器改良与升级的实验室,最近该实验室收到了某公司所委托的一个任务:需要在该公司某型号的计算器上加上解一元一次方程的功能.实验室将这个任务交给了 ...

  6. P1010 幂次方 P1022 计算器的改良

    P1010 幂次方 一.题目 https://www.luogu.org/problemnew/show/P1010 二.代码 #include<bits/stdc++.h> using ...

  7. 2021.07.26 P1022 计算器的改良(字符串)

    2021.07.26 P1022 计算器的改良(字符串) 改进: 如果是我出题,我一定把未知数设为ab.buh.bluesky之类的长度不只是1的字符串! 题意: 一个一元一次方程,求解. 分析: 1 ...

  8. [NOIP2000] 提高组 洛谷P1022 计算器的改良

    题目背景 NCL是一家专门从事计算器改良与升级的实验室,最近该实验室收到了某公司所委托的一个任务:需要在该公司某型号的计算器上加上解一元一次方程的功能.实验室将这个任务交给了一个刚进入的新手ZL先生. ...

  9. NOIP2000普及组 T1计算器的改良

    主要考字符串处理,把等式从等号中间断开,左边的区域为left,右边的区域为right. 开四个数组分别用来存储区域left和right中未知数的系数,区域left和right中的常数 先处理区域lef ...

随机推荐

  1. WAS 与IHS集成问题

    1.安装好WAS与IHS后 发布Web发现无法启动 查阅资料后发现缺少插件Plugins 于是去下载安装对应版本的Plugins 发现还是有问题 后来想起发布web01时,插件还未安装.因此重新发布一 ...

  2. Python compile() 函数

    Python compile() 函数  Python 内置函数 描述 compile() 函数将一个字符串编译为字节代码. 语法 以下是 compile() 方法的语法: compile(sourc ...

  3. java深拷贝与浅拷贝

    1.调用Object类的clone方法必须实现Cloneable接口,clone属于浅拷贝. 2.可以通过java的反序列化机制进行深拷贝. 3.可以直接用apache提供的一些包进行深拷贝和浅拷贝, ...

  4. JS参数转发

    在没有装饰器之前不方便. 可以用Reflect.apply. cls = function f() { let obj = {}; obj.show = function(a, b) { consol ...

  5. HTTP Basic Authentication认证(Web API)

    当下最流行的Web Api 接口认证方式 HTTP Basic Authentication: http://smalltalllong.iteye.com/blog/912046 什么是HTTP B ...

  6. React-router4 第三篇 BasicURL ParametersRedirects (Auth) 谷歌翻译:重定向

    依旧是地址 https://reacttraining.com/react-router/web/example/auth-workflow 上来一步走 先导入模块 import React, { P ...

  7. Svn Server 强制提交者输入注释信息

    目的:在项目开发过程中,强制团队成员必须在提交前写上注释 环境简述:SVN服务器:Windows Server 2008 SVN版本:VisualSVN Ltd.  2.7.5 操作方法:在SVN的R ...

  8. Linux硬件相关

    1)查看设备号/厂商号 http://blog.csdn.net/styshoo/article/details/51203881   二.硬件厂商 1)瑞传科技股份有限公司 https://www. ...

  9. 24.Mysql高级安装和升级

    24.Mysql高级安装和升级24.1 Linux/Unix平台下的安装 24.1.1 安装包比较Linux下的Mysql安装包分为RPM包.二进制包.源码包3种.RPM包优点是安装简单,适合初学者: ...

  10. 自适应手机网站meta name代码

    <meta name="viewport" content="width=device-width,initial-scale=1.0">   co ...