题目链接:计算器的改良

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

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

我们需要计算什么?

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

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

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

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

#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. IDEA中配置JUnit单元测试

    参考安装教程:https://www.jianshu.com/p/c37753b6dbd6 如果想用junit4的话,需要在pom.xml中配置. 需要安装JUnitGenerator V2.0插件, ...

  2. java实现person类 override(重写) comparable接口

    具体题目如下: 定义一个Person类,包含姓名(name).身高(height).体重(weight),以及talk()方法,该方法的功能是,输出自己的身高和体重信息.Person类实现Compar ...

  3. cloudera cdh5.13.0 vmware 快速安装

    1. 从官网上载VMWARE VM快速安装包 https://www.cloudera.com/downloads/quickstart_vms/5-12.html 2. 下载后的安装包,解压之后得到 ...

  4. HDU-1002.大数相加(字符串模拟)

    本题大意:给出两个1000位以内的大数a 和b,让你计算a + b的值. 本题思路:字符串模拟就能过,会Java的大佬应该不会点进来...... 参考代码: #include <cstdio&g ...

  5. 154. Find Minimum in Rotated Sorted Array II (Array; Divide-and-Conquer)

    Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. (i.e. ...

  6. 11. Container With Most Water(头尾双指针)

    Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, ai). ...

  7. Alley Bird 跳跳鸟源码

    <跳跳鸟Alley Bird>是一款敏捷小游戏.<跳跳鸟Alley Bird>采用了点击屏幕操作玩法,非常简单易上手,同时游戏内容也趣味性十足.<跳跳鸟Alley Bir ...

  8. ActiveMQ之HelloWorld

    JMS实现JMS接口的消息中间件 Provider:生产者 Consumer:消费者 PTP:Point to Point:点对点的消息模型 Pub/Sub:Publish/Subscribe:发布订 ...

  9. java编程 求和

    用java编程,实现字符串强制类型转化成整数型,用到Integer.parseInt(),可以把字符串强制转换成整数 结果截图

  10. Union and Intersection of two sorted lists 并集和交集

    跟面试官确认是arrayList还是singly-linked list /*  Union 并集:两个升序的list a, b, 返回其并集(升序排序)*/ public class UnionTw ...