#include <bits/stdc++.h> using namespace std; //分别为二次项,一次项,常数项的系数 double a = 0, b = 0, c = 0; int pos = -1; //等号位置 int main() { string s; while (getline(cin, s)) { //1.找到等号的位置 for (int i = 0; i < s.length(); i++) { if (s[i] == '=') { pos = i; break; } } //2.判断一下开头和等号后面系数是不是负的,如果是正的就应该加个正号 if (s[0] != '-') { s.insert(0, 1, '+'); pos++; } if (s[pos + 1] != '-') s.insert(pos + 1, 1, '+'); //3.将等号右边的移项到左边 for (int i = pos + 1; i < s.length(); i++) { if (s[i] == '+') s[i] = '-'; else if (s[i] == '-') s[i] = '+'; } //4.将等于号去掉 s.erase(pos, 1); //5.进行遍历,统计各次系数 for (int i = 0; i < s.length();) { bool fushu = 0;//默认不是负数 if (s[i] == '+' || s[i] == '-') { //判断一下符号 if (s[i] == '-') fushu = 1;//是负数 i++; //如果符号紧跟的是数字,这个数字可以是任何次项的系数 if (isdigit(s[i])) { string xishu = ""; if (isdigit(s[i])) { //先统计系数 while (isdigit(s[i]) && i < s.length()) { xishu += s[i]; i++; } if (fushu == 1) xishu.insert(0, 1, '-'); //到尾巴了,或者接着的是符号,则一定是常数项的系数 if (i == s.length() || s[i] == '+' || s[i] == '-') c += stoi(xishu); else { //系数紧接着是x,不能确定是一次还是二次 if (s[i] == 'x') { if (i < s.length() - 1) { i++; //如果x紧接着是^,那就是二次的系数 if (s[i] == '^') { a += stoi(xishu); i += 2;//跳过^2 } else { //否则就是一次的系数 b += stoi(xishu); } } } } } } //如果符号紧跟的是x,只可能是一次或者二次的系数,且系数一定是1/-1 if (s[i] == 'x') { if (i < s.length() - 1) { i++; //如果x后面跟的是^,则是二次系数 if (s[i] == '^') { if (fushu == 1) a--; else a++; i++; } else { if (fushu == 1) b--; else b++; i--; } } else { if (fushu == 1) b--; else b++; } i++; } } } bool youjie = 1; double t = b * b - 4 * a * c; if (t < 0) { cout << "No Solution" << endl; youjie = 0;//无解 } if (youjie == 1) { double res1 = double(-b + sqrt(t)) / (2 * a); double res2 = double(-b - sqrt(t)) / (2 * a); if (res1 > res2) swap(res1, res2); cout << fixed << setprecision(2) << res1 << " " << res2 << endl; } } } // 64 位输出请用 printf("%lld")