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