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

发表评论

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