题解 | #二次方程计算器#

二次方程计算器

https://www.nowcoder.com/practice/071f1acaada4477f94193f8c0b9054f4

#include <bits/stdc++.h>
using namespace std;
bool isNum(char ch){ // 判断字符是否为数字
    if('0'<=ch&&ch<='9') return true;
    return false;
}
void getNums(string str, int &a, int &b, int &c){ // 根据字符串str得到各项系数abc
    int len=str.length();
    int curNum=0,sign=1; // sign默认正数,读到加减号后更新
    for(int i=0;i<=len;i++){
        if(isNum(str[i])){ // case 1:遇到数字
            curNum=curNum*10+(str[i]-'0'); // 注意str[i]为char类型。。。
        }
        else if(str[i]=='x'){ // case 2:遇到 x,说明a或b已确定
            if(i==0) curNum=1;  // case 2.1 获得首字符的系数1
            else if((!isNum(str[i-1]))||str[i-2]=='^'){ // case 2.2 获得中间字符的系数1
                curNum=1;
            }
            if(str[i+1]=='^'){ // 判断系数属于a还是b
                a=sign*curNum;
                curNum=0;
                i=i+2; // 始终保持 i 的下一位为待处理的字符
            }
            else{
                b=sign*curNum;
                curNum=0;
            }
        }
        else if(str[i]=='+'||str[i]=='-'){ // case 3:遇到加减号
            if(isNum(str[i-1])){ // 若算符前一位是数字,需要判断是否为常数c
                if(!(i>=2&&str[i-2]=='^')){ // 只有一种情况(x^2)不是常数c,排除它
                    c=sign*curNum;
                    curNum=0;
                }
            }
            if(str[i]=='+') sign=1; // 常数确定后,再更新系数的正负号
            else if(str[i]=='-') sign=-1;
        }
        else if(str[i]==NULL){ // case 4: 处理到末尾,需要判断串尾是否为常数c
            if(isNum(str[i-1])&&str[i-2]!='^'){ // 最后一位为数字且不是x^2时,为常数c
                c=sign*curNum;
                curNum=0;
            }
        }
    }
    // cout<<"a="<<a<<",b="<<b<<",c="<<c<<endl; // test
}
void calFun(int a, int b, int c){ // 输入二次方程,默认 a!=0
    double delta=b*b-4*a*c;
    if(delta<0) cout<<"No Solution"<<endl;
    else{
        double x1,x2;
        x1=(-b-sqrt(delta))/(2*a);
        x2=(-b+sqrt(delta))/(2*a);
        printf("%.2f %.2f",x1,x2);
    }
}
int main() {
    string str;
    while(cin>>str){
        string leftStr,rightStr;
        int al=0,bl=0,cl=0,ar=0,br=0,cr=0; // 系数分为两部分
        int i;
        for(i=0;str[i]!='=';i++) leftStr+=str[i]; // 出循环时,i指向'='
        for(i=i+1;str[i]!=NULL;i++) rightStr+=str[i];
        getNums(leftStr,al,bl,cl); // 分别得到两侧表达式的系数
        getNums(rightStr,ar,br,cr);
        int a=al-ar,b=bl-br,c=cl-cr; // 移项
        calFun(a,b,c);
    }
    return 0;
}

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务