1. 题目

传送门= ̄ω ̄=

题意:输入一个一元一次方程,求解。方程中的运算符只会有“+ – =”三个符号。

2. 题解

很水的模拟。
但不知道为什么dalao们的代码都那么长。。。
设$xc$为未知数合并以后的系数,$cc$为常数合并以后得到的常数。答案就是$-cc/xc$
移项不需要真正移动,设一个$flag$,当读到等于号时设置$flag$为$-1$即可。每次把得到的数字乘以$flag$。
getchar一个个读入字符,遇到EOF(end of file)停止读入。
读到”=”就设置$flag$为$-1$,后面得到的系数全部乘以$flag$,就实现了移项($flag$初始为1)。
读到”-“就设置$flag2$为-1,后面得到的一个系数乘以$flag2$,乘完以后$flag2$清空为$1$。
读到”+”不管它。
读到数字就使当前系数*10再加上该数字。

因为有未知数,未知数系数如果没写默认为1,所以数字时初始为1,所以需要特判,是否为未知数项。
这个用一个bool型的isnew变量就可以判断。isnew默认为1,如果读到一个数字且isnew为1,isnew设为0,数字也设为0。

还要注意,如果cc为0,那么答案会得到-0.000,就WA了。
需要特判。

代码:

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int xc=0,cc=0,con=1,flag=1,flag2=1;char x,c;bool isnew=1;
    while(c=getchar(),c!=EOF)
    {
        if(isalpha(c))x=c,xc+=con*flag*flag2,con=flag2=isnew=1;
        else if(c=='=')cc+=con*flag*flag2*(isnew^1),con=flag2=isnew=1,flag=-1;
        else if(c=='-')cc+=con*flag*flag2*(isnew^1),con=isnew=1,flag2=-1;
        else if(c=='+')cc+=con*flag*flag2*(isnew^1),con=flag2=isnew=1;
        else if(isdigit(c)){if(isnew)con=isnew=0;con=con*10+c-'0';}
    }
    float ans=float((float)(-(cc+con*flag*flag2*(isnew^1)))/(float)(xc));
    if(abs(ans)<1e-6)ans=0;
    printf("%c=%.3f\n",x,ans);
    return 0;
}
分类: 所有

XZYQvQ

炒鸡辣鸡的制杖蒟蒻一枚QvQ

发表评论

电子邮件地址不会被公开。 必填项已用*标注

你是机器人吗? =。= *