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

posted @ 2019-06-14 14:55  千载煜  阅读(253)  评论(0编辑  收藏  举报