题目链接:计算器的改良

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

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

我们需要计算什么?

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

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

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

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

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int main(){
  4. char c; //用于读入字符
  5. int lxs=0,rxs=0; //未知数左边系数和右边系数
  6. int lcs=0,rcs=0; //左边常数和右边常数
  7. int lor=0; //在左边还是右边的标识符
  8. int num=0; //用于保存当前操作数
  9. int opera=0; //操作标识符(0是加,1是减)//1
  10. char x; //保存未知数
  11. while(scanf("%c",&c)!=EOF){ //每次读入一个字符
  12. if(c>='0'&&c<='9'){ //如果是数字
  13. num=num*10+c-'0'; //2
  14. }else if(c=='+'){ //如果是加号
  15. if(lor==0){ //判断是在等号左边还是右边
  16. if(opera==0){ //判断操作标识符
  17. lcs+=num;
  18. }else{
  19. lcs-=num;
  20. }
  21. }else{
  22. if(opera==0){
  23. rcs+=num;
  24. }else{
  25. rcs-=num;
  26. }
  27. }
  28. num=0; //操作数设置为0
  29. opera=0;
  30. }else if(c=='-'){
  31. if(lor==0){
  32. if(opera==0){
  33. lcs+=num;
  34. }else{
  35. lcs-=num;
  36. }
  37. }else{
  38. if(opera==0){
  39. rcs+=num;
  40. }else{
  41. rcs-=num;
  42. }
  43. }
  44. num=0;
  45. opera=1;
  46. }else if(c=='='){
  47. if(lor==0){
  48. if(opera==0){
  49. lcs+=num;
  50. }else{
  51. lcs-=num;
  52. }
  53. }else{
  54. if(opera==0){
  55. rcs+=num;
  56. }else{
  57. rcs-=num;
  58. }
  59. }
  60. num=0;
  61. opera=0;
  62. lor=1; //转变等式方位
  63. }else if(c>='a'&&c<='z'){ //如果是字母
  64. x=c; //保存未知数
  65. if(num==0){
  66. num=1;
  67. }
  68. if(lor==0){
  69. if(opera==0){
  70. lxs+=num;
  71. }else{
  72. lxs-=num;
  73. }
  74. }else{
  75. if(opera==0){
  76. rxs+=num;
  77. }else{
  78. rxs-=num;
  79. }
  80. }
  81. num=0;
  82. }
  83. }
  84. if(num!=0){ //3
  85. if(opera==0){
  86. rcs+=num;
  87. }else{
  88. rcs-=num;
  89. }
  90. }
  91. double ans=(double)(rcs-lcs)/(double)(lxs-rxs);
  92. if(ans==0.0){ //4
  93. ans=abs(ans);
  94. }
  95. printf("%c=%.3f",x,ans); //5
  96. return 0;
  97. }

这里我主要讲一下每一种情况的操作是为什么。

首先遇到数字,我们就将他保存在操作数,为什么不操作?因为我们只读了一个数字,不能确保后面没有数字,而他们是同一个数,所以我们只把新读的数字加到操作数的末尾。

遇到加减时,如果操作数为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. 五 shutil模块

    高级的 文件.文件夹.压缩包 处理模块 shutil.copyfileobj(fsrc, fdst[, length])将文件内容拷贝到另一个文件中 1 import shutil 2 3 shuti ...

  2. opencv: Rotate image by 90, 180 or 270 degrees

    opencv2: void rotate_cw(const cv::Mat& image, cv::Mat& dest, int degrees) { ) { : dest = ima ...

  3. P3796 【模板】AC自动机(加强版)

    P3796 [模板]AC自动机(加强版) https://www.luogu.org/problemnew/show/P3796 题目描述 有NN个由小写字母组成的模式串以及一个文本串TT.每个模式串 ...

  4. Linux防火墙操作

    从配置菜单关闭防火墙是不起作用的,索性在安装的时候就不要装防火墙. 查看防火墙状态: /etc/init.d/iptables status暂时关闭防火墙: /etc/init.d/iptables  ...

  5. mysql5.7 生成列 generated column

    生成列的值是根据列定义中的表达式计算得出的. mysql5.7支持两种类型的生成列: 1.virtual 生成列:当从表中读取记录时,才计算该列值.不会把数据持久化在硬盘上. 2.stored 生成列 ...

  6. sql:inner join,left join,right join,full join用法及区别

    join的语法: select [字段] from [表名1] inner/left/right/full join [表名2] on [表名1.字段1] <关系运算符> [表名2.字段2 ...

  7. python collections 里面的Counter 统计所有出现的字符数量

    from collections import Counter c_num = Counter('Hello world') # 统计出现的每个字符数量print(c_num) for key, va ...

  8. Linux pip安装使用详解

    简介 pip是Python有它自己的包管理工具,与yum和apt-get相似. 安装步骤: 1.下载get-pip.py:https://bootstrap.pypa.io/get-pip.py 2. ...

  9. (转)OOP(面向对象编程)的几大原则

    文章转载自:http://blog.csdn.net/anders_zhuo/article/details/8949566 设计模式遵循的一般原则: 1.开-闭原则(Open-Closed Prin ...

  10. 8Q - 献给杭电五十周年校庆的礼物

    我不能参赛,就送给学校一个DOOM III球形大蛋糕吧.等一等,吃蛋糕之前先考大家一个问题:如果校长大人在蛋糕上切了N刀(校长刀法极好,每一刀都是一个绝对的平面),最多可以把这个球形蛋糕切成几块呢?  ...