人麻了,思路很简单清晰,但写起来 代码问题一堆。

思路:等式输入进字符串中,根据+ = -这些符号把多项式等式拆分成每个多项式项,例如 2x^2, 3x ,-4 。

然后对这些项计算二次项系数a,一次项系数b,常数项系数c,利用求根公式得到结果。

但实际在拆分的时候边界条件还是非常麻烦,但最后求出a,b,c就很简单输出答案了

#include <iostream>
#include <vector>
#include <string>
#include <iomanip>
#include <cmath>
using namespace std;

int main() {
    string equation;
    int a=0, b=0, c=0;
    vector<string> elements;
    char signal = '+';
    bool flag = true;
    while (cin >> equation) { // 注意 while 处理多个 case
        int index = equation.find('=');
        string equation1 = equation.substr(0, index);
        string equation2 = equation.substr(index + 1);

        for (int i = 1, j = -1; i < equation1.size(); i++) {
            if (equation1[i] == '+') {
                elements.push_back(signal + equation1.substr(j + 1, i - j - 1));
                signal = '+';
                j = i;
            } else if (equation1[i] == '-') {
                elements.push_back(signal + equation1.substr(j + 1, i - j - 1));
                signal = '-';
                j = i;
            }
            if (i == equation1.size() - 1) {
                elements.push_back(signal + equation1.substr(j + 1, i - j + 1));
                signal = '-';
            }
        }

        for (int i = 1, j = -1; i < equation2.size(); i++) {
            if (equation2[i] == '+') {
                elements.push_back(signal + equation2.substr(j + 1, i - j - 1));
                signal = '-';
                j = i;
            } else if (equation2[i] == '-') {
                elements.push_back(signal + equation2.substr(j + 1, i - j - 1));
                signal = '+';
                j = i;
            }
            if (i == equation2.size() - 1) {
                elements.push_back(signal + equation2.substr(j + 1, i - j + 1));
            }
        }
        // cout<<equation2<<endl;
        int signal;
        for (int i = 0; i < elements.size(); i++) {
            if (elements[i][0] == '+') signal = 1;
            else signal = -1;
            if (elements[i].find("x^2") != string::npos) {
                string s = elements[i].substr(1, elements[i].size() - 4);
                if (s.size() == 0) s = "1";
                a += signal * stoi(s);
            } else if (elements[i].find("x") != string::npos) {
                string s = elements[i].substr(1, elements[i].size() - 2);
                if (s.size() == 0) s = "1";
                // cout<<signal * stoi(s)<<endl;
                b += signal * stoi(s);
            } else {
                string s = elements[i].substr(1, elements[i].size() - 1);
                if (s.size() == 0) s = "1";
                c += signal * stoi(s);            }
            // cout << elements[i] << endl;
        }
        // cout<<a<<" "<<b<<" "<<c<<"";
        double derta = (double)b * b - 4 * a * c;
        if (derta > 0) cout <<fixed<<setprecision(2)<<
         (-b + pow(derta,0.5)) / (2 * a) 
         << " " 
         << (-b - pow(derta, 0.5)) / (2 * a) << endl;
        else cout << "No Solution" << endl;
    }
}
// 64 位输出请用 printf("%lld")