给刘珈汝写的:
1.设置a b c分别为二次方、一次放、常数的系数。
2.设置flag为数的正负,如果遇到+,flag=1,如果遇-,flag=0;
3.如果遇到x,则判断下一位是不是^,如果是^说明是平方的系数,否则说明是一次方的系数
4.如果遇到数字,判断数字的下一位是不是符号或者末尾,如果是则数字不是系数是常数
5.设置mode表示=的左边或者右边,如果mode==0说明,等号左边,abc都直接加系数,如果 mode==1,等号右边,abc都要减系数,因为移项后符号相反。
6.最后用求根公式就可以了

#include<iostream>
#include<math.h>
#include<string>
using namespace std;
int a,b,c,i,num;
void process(string s,int mode){//对字符串进行处理,mode表示模式,对应上边的第五条。
    int flag=1,i=num=0;
    while(i<s.size()){
        if(s[i]=='x'){
            if(i+1!=s.size()&&s[i+1]=='^'){//对应上边第三条
                a+=(num==0?(flag==1?(mode==0?1:-1):(mode==0?-1:1)):num);i+=2;
            }else{
                b+=(num==0?(flag==1?1:-1):num);
            }i+=1;
        }else if(s[i]=='+'){//对应上边的第二条
            flag=1;num=0;i++;
        }else if(s[i]=='-'){//对应上边的第二条
            flag=0;num=0;i++;
        }else if(s[i]>='0'&&s[i]<='9'){//对应上边第四条
            while(s[i]>='0'&&s[i]<='9'){
                num=num*10+s[i]-'0';
                i++;
            }if(flag==(mode==0?0:1))num=-num;
            if(s[i]!='x'){
                c+=num;
            }
        }
    }
}
int main(){
    string s;
    while(cin>>s){
        a=b=c=0;
        int pos=s.find('=');
        string pre=s.substr(0,pos);//截取=左边的字符串
        string ed=s.substr(pos+1);//截取=右边的字符串
        process(pre,0);
        process(ed,1);
        float derta=b*b-4*a*c;//求根公式 x1,x2=(-b+根号detar)/(2a);detar=b^2-4ac
        if(derta<0){
            cout<<"No Solution"<<endl;
        }else{
            float x1=(-b+sqrt(derta))/2/a;
            float x2=(-b-sqrt(derta))/2/a;
            if(x1>x2)printf("%.2f %.2f\n",x2,x1);
            else printf("%.2f %.2f\n",x1,x2);
        }
    } 
    return 0;
}