洛谷--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 }
希望对大家有帮助!~