http://ac.jobdu.com/problem.php?pid=1103 二次方程计算器
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int main(void)
{
int i,index,a,b,c,m,sign,ra,rb,rc;
char str[200];
double rt,first,second;
while(scanf("%s",str)!=EOF)
{
for(i=0;str[i]!='\0';i++)
{
if(str[i]=='=')
{
index=i;
break;
}
}
a=b=c=0;
m=0,sign=1;
for(i=0;i<index;) //方程等式的左半部分
{
if(str[i]>='0' && str[i]<='9')
{
m=m*10+str[i]-'0';
i++;
}
else if(str[i]!='x')
{
if(str[i]=='+')
{
c+=m*sign;
sign=1;
}
else if(str[i]=='-')
{
c+=m*sign;
sign=-1;
}
i++;
m=0;
}
else if(str[i]=='x' && str[i+1]=='^')
{
if(i==0 || str[i-1]=='+' || str[i-1]=='-')
m=1;
a+=m*sign;
m=0;
i=i+3;
}
else if(str[i]=='x' && str[i+1]!='^')
{
if(i==0 || str[i-1]=='+' || str[i-1]=='-')
m=1;
b+=m*sign;
m=0;
i++;
}
}//for
c+=m*sign;
ra=rb=rc=0;
m=0,sign=1;
for(i=index+1;str[i]!='\0';) //方程等式的右半部分
{
if(str[i]>='0' && str[i]<='9')
{
m=m*10+str[i]-'0';
i++;
}
else if(str[i]!='x')
{
if(str[i]=='+')
{
rc+=m*sign;
sign=1;
}
else if(str[i]=='-')
{
rc+=m*sign;
sign=-1;
}
i++;
m=0;
}
else if(str[i]=='x' && str[i+1]=='^')
{
if(i==index+1 || str[i-1]=='+' || str[i-1]=='-')
m=1;
ra+=m*sign;
m=0;
i=i+3;
}
else if(str[i]=='x' && str[i+1]!='^')
{
if(i==index+1 || str[i-1]=='+' || str[i-1]=='-')
m=1;
rb+=m*sign;
m=0;
i++;
}
}//for
rc+=m*sign;
a-=ra;
b-=rb;
c-=rc;
if(b*b-4*a*c>=0)
{
rt=sqrt(1.0*b*b-4*a*c);
if(a>0)
{
first=(-b-rt)/(2*a);
second=(-b+rt)/(2*a);
}
else
{
first=(b+rt)/(-2*a);
second=(b-rt)/(-2*a);
}
if(first<second)
printf("%.2lf %.2lf\n",first,second);
else
printf("%.2lf %.2lf\n",second,first);
}
else
printf("No Solution\n");
}
return 0;
}
// 3x+4=x^2+x
// -x^2=0