P1022计算器の改良
这个题让你通过自己的努力,来写一个可以解一元一次方程的计算题(麻麻再也不用担心我计算错了qwq)
我们先学习一下一元一次方程的解法
step1:移项。把带有未知数的项移到方程的一边,把常数项移到方程的另一边。
step2:系数化一。方程左右两边同时除以未知数的系数
step3:写答(最后别忘了输出是"未知数=....."的格式)
解方程都会,关键是怎么让电脑进行移项。我们在解方程的时候通常把未知数移到左边,常数移到右边,并且在等号右边含有未知数的项是要变号的,在等号左边常数项要变号。所以我们在计算未知数的系数与常数时,可以以等号为划分点,进行计算。
方程用字符串的形式读入,我们也注意到,每一项的起点是发现“+“ ”-” “=”,终点也是如此。所以我们在没有扫描到符号或未知数时,就继续计算当前项的绝对值,当扫描到下一个符号的时候,就将算好的值按照符号与是否扫描过等号累加(这里分别用k,v记录未知数的系数和所有常数项的和)
v/k的值即为答案,注意ans如果是-0,要特判,输出正0(虽然这俩没毛区别,但评测机说你错了你就错了)
一些小坑见代码
#include<iostream> #include<cstdio> #include<cmath> #include<algorithm> #include<cstring> using namespace std; char a[1000],c,aa;//aa记录未知数是什么字符 int m,k,q,v; bool dy,xs;//dy标记是否扫描过等号,xs标记是否是含未知数的项(系数) int main() { scanf("%s",a); for(int i=0;i<strlen(a);i++)//我们顺序扫描 {if(a[i]=='+'||a[i]=='-'||a[i]=='=') { if(dy)//等号右边的项 {if(xs){if(m==0)m=1;if(c=='-'){k+=m;m=0;}else{k-=m;m=0;}}//注意若未知数前面不写系数,则系数是1 else{if(c=='-'){v-=m;m=0;}else{v+=m;m=0;}} } if(!dy)//等号左边的项 {if(xs){if(m==0)m=1;if(c=='-'){k-=m;m=0;}else{k+=m;m=0;}} else{if(c=='-'){v+=m;m=0;}else{v-=m;m=0;}} } if(a[i]=='=')dy=1;//注意这些的更新顺序 c=a[i]; //记录符号 xs=0; } else if(a[i]>='0'&&a[i]<='9') {m=m*10+a[i]-48;xs=0;} //只有是数字的字符才计算 else {xs=1;aa=a[i];//记下未知数的字符 } } if(xs)//最后一项扫描不到,要补上 {if(c=='-')k+=m; else k-=m; } else {if(c=='-')v-=m; else v+=m; } double ans; if(k!=0) ans=1.0*v/k; else ans=0.000; if(ans==-0)ans=0; cout<<aa<<"="; printf("%.3lf",ans); }
打了好久qwq