题目没说清测试用例是否会退化为一次方程,把无穷解的情况归类为无解了;(你也不告诉我最大字符串的长度,人家北大就告诉);

思路:

1)利用符号('-''+''=''\0')分段读取,把字符串解析为数值;

2)左右双指针取段,r从1开始即可解决负数开头的情况;

3)利用flag控制正负,减少代码量,没别的代码少,写的快就是最贵的,时间什么的无所谓,能过就行;

高阶玩法:

可以用c++<regex>正则表达式;用的好挺玩赖的;

#include <stdio.h>
#include <string.h>
#include <math.h>

float delta(float a, float b, float c) {return b*b-4*a*c;}

void getans(float a, float b, float c){
    float d = delta(a, b, c);
    if(a==0 && b!=0) printf("%.2f %.2f\n", -c/b, -c/b);
    else if(a==0 && b==0) printf("No Solution\n");
    else if(d>=0){
        printf("%.2f %.2f\n", (-b-sqrt(d))/(2*a), (-b+sqrt(d))/(2*a));
    }else printf("No Solution\n");
}

int getn(char *str, int len){
    int res=0, i=0, flag=1;
    if(str[0]=='-'){
        ++i;
        flag=-1;
    }
    if(i==len) res=1;
    else{
        while(i<len){
            res *= 10;
            res += str[i]-'0';
            ++i;
        }
    }
    return res*flag;
}

void getnums(char *str, float *a, float *b, float *c){
    int l=0, r=1, flag=1;
    while(r<=strlen(str)){
        while(r<strlen(str)&&!(str[r]=='+' || str[r]=='-' || str[r]=='='))++r;
        if(r-l>2&&str[r-3]=='x'){*a+=flag*getn(str+l, r-l-3);}
        else if(str[r-1]=='x'){*b+=flag*getn(str+l, r-l-1);}
        else {*c+=flag*getn(str+l, r-l);}
        l=r+1;
        if(str[r]=='=') {flag=-1; ++r;}
        ++r;
    }
}

int main()
{
    char str[100];
    while(scanf("%s", str)!=EOF){
        float a=0, b=0, c=0;
        getnums(str, &a, &b, &c);
        getans(a, b, c);
    }
    return 0;
}