给刘珈汝写的:
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;
}


京公网安备 11010502036488号