WA 64分求调
查看原帖
WA 64分求调
837308
Andycode3759楼主2022/12/3 07:46

大概阐述一下我的思路:把原始方程的所有项进行拆分,每一个项满足[+|-]num[x]的形式,即把加减号全部处理为单项的正负号。将方程化为ax+b=0ax+b=0的一般形式后用公式x=bax=-{b \over a}求解,在处理单个项时看最后是不是字母,决定系数是加在a还是b上。等号右边的项系数取相反数。

#include <bits/stdc++.h>
using namespace std;

int a, b;
// equa => ax+b=0
bool aftereq = false;
char letter;

void parse(string s) //处理单个项,保证s符合[+|-]?[0-9]+[a-z]?的形式
{
    bool sign = true;
    int i = 0;
    if (s[0] == '-')
    {
        sign = false;
        i = 1;
    }
    if (s[0] == '+')
        i = 1; //处理开头的符号
    int num = 0; //系数的绝对值
    bool isletter = false; //带未知数项
    for (; i < s.size(); i++) //逐个字符扫描
    {
        if (s[i] >= '0' && s[i] <= '9') //是数字
        {
            num = num * 10 + s[i] - '0';
        }
        else //数字扫完了碰到的一定是字母
        {
            letter = s[i];
            isletter = true;
        }
    }
    if (!sign)
        num = -num; //加上符号
    if (aftereq)
        num = -num; //是等号之后的项取相反数
    if (isletter) //判断是常数项还是未知数项
        a += num;
    else
        b += num;
}

int main()
{
    string equa;
    cin >> equa;
    int s = 0;
    for (int i = 0; i < equa.size(); i++)  //处理原方程拆分项
    {
        if (equa[i] == '+' || equa[i] == '-') //正负号和等号可以看成前一项的结束
        {
            parse(equa.substr(s, i - s));
            s = i;
        }
        else if (equa[i] == '=')
        {
            parse(equa.substr(s, i - s));
            s = i + 1;
            aftereq = true;
        }
    }
    parse(equa.substr(s, equa.size() - s)); //最后一项要处理

    printf("%c=%.3f\n", letter, -(b * 1.0) / a);
    return 0;
}
2022/12/3 07:46
加载中...