题解 | #二次方程计算器#
二次方程计算器
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;
}
查看3道真题和解析



