洛谷--P1022 计算器的改良

队友都在找模板题了,菜鸟般的我还是刷刷题(不要拖队伍后退就知足了)

不得不承认,看到题目的一瞬间我是蒙的,之前没有遇到解方程这类题型,感觉回到了初中?还是小学,重新拿起手中的笔,开始研究解方程的步骤...

不过,经历了几次碰壁之后,只用简单的模拟就可以解决了,有时候,真的是空想不如实践呢~

题目链接:https://www.luogu.org/problem/P1022

首先,我们先了解一下解方程的步骤:

1.去分母:在方程两边都乘以各分母的最小公倍数;(题目没有要求) 
2.去括号:先去小括号,再去中括号,最后去大括号; (题目没有要求)
3.移项:把含有未知数的项都移到方程的一边,其他项都移到方程的另一边; 为了方便,我们把等式右边的多项式移至左边
4.合并同类项:把方程化成 ax=b (a≠0) 的形式; 
5.系数化成1:在方程两边都除以未知数的系数a,得到方程的解

因为一个方程包含数字、符号、字母,所以我们一个一个读入,用char类型读取,接下来就是一串 if 。。。

1、对于 + 、 - 、 = 的处理

b为常数项的值,

num表示多项式相对于等号的位置,左边为 1 ,右边为 -1,读到等号之后,num则变为-1;

f 表示多项式的正负性,

x是系数,读到加号,则常数累加,同理,减号则相减;

flag 判断读入的是否为数字,如果是数字,则 为1,否则为0,

2、数字的判断

 3、未知数(小写字母)的判断

k为未知数的系数,在这里要分为两种情况。因为x的系数可以是1,-1。因此,我们靠flag值来判断未知数前面有没有除这两种情况的系数

4、特殊情况处理

浮点数中,存在+0和-0之分,如果出现-x=0的情况,我们则需要把它改为0

 AC代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 char c,ch;//c用于读入,ch记录未知数
 4 int f=1,num=1,k,b,x;
 5 bool flag;  //判断是否有数字
 6 int main() {
 7     while(scanf("%c",&c)!=EOF)
 8     {
 9         if(c=='-')
10         {
11             b+=num*f*x;x=0;f=-1;flag=0;
12         }
13         if(c=='+')
14         {
15             b+=num*f*x;x=0;f=1;flag=0;
16         }
17         if(c=='=')
18         {
19             b+=num*f*x;x=0;f=1;num=-1;flag=0;
20         }
21         if(c>='a'&&c<='z')
22         {
23             if(flag)
24             {
25                 k+=num*f*x;
26                 x=0;
27             }
28             else
29                 k+=num*f;
30                 ch=c;
31                 flag=0;
32         }
33         if(c>='0'&&c<='9')
34         {
35             x=x*10+c-'0';
36             flag=1;
37         }
38     }
39     b+=num*f*x;
40     double ans=double(-b*1.0/k);
41     if(ans==-0.0)
42         ans=0;
43     printf("%c=%.3lf",ch,ans);
44     return 0;
45 }

希望对大家有帮助!~

猜你喜欢

转载自www.cnblogs.com/acmer-hmin/p/11743304.html