题目链接:计算器的改良

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

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

我们需要计算什么?

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

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

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

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

#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. StringBuffer类和String类(原文地址 : http://www.cnblogs.com/springcsc/archive/2009/12/03/1616330.html)

    StringBuffer类和String一样,也用来代表字符串,只是由于StringBuffer的内部实现方式和String不同,所以StringBuffer在进行字符串处理时,不生成新的对象,在内存 ...

  2. Maven 基本参数

    -h,--help                              Display help information-am,--also-make                       ...

  3. Django的几种缓存的配置

    1.缓存的简介 在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑,最后生成用户看到的页面. 当一个网站的用户访问量很大的时候,每一次的的后台操作,都会 ...

  4. 不包含数据和字母的Webshell

        在做php20中的challenge5时学习到了php中可代替数字和字母的符号,悲剧的是这道题没做出来,目前先整理知识点吧555555555555     情况是:很多时候在敏感地方WAF会阻 ...

  5. UVa 548 Tree(二叉树最短路径)

    You are to determine the value of the leaf node in a given binary tree that is the terminal node of ...

  6. java初学网站

    http://www.jfinal.com/doc http://www.w3school.com.cn/

  7. 【centos】centos安装配置samba

    因为我的centos为一台阿里云服务器,想和我本机(mac)进行文件共享.所以在我的阿里云上安装配置samba. 服务器环境:centos 7.3 本地环境:mac 第1步:首先查看是否已经安装过了s ...

  8. linux虚拟机ping不通主机和外网(包括刚装系统遇到的一些问题)

    自己ubuntu系统安装了一个virtualBox虚拟机,里面又装了一个ubuntu-server系统: 1.先设置一下字符集,因为一开始装系统的时候选择的是中文,但里面始终无法支持中文,那就算了,反 ...

  9. 4-java 格式化输出

    java保留两位小数4种方法 import java.math.BigDecimal; import java.text.DecimalFormat; import java.text.NumberF ...

  10. Linux后台运行进程

    方式一: /bin/bash /var/www/html/crontab.sh & 缺点:终端关闭的话,进程也会关闭. 方式二: nohup /bin/bash /var/www/html/c ...