#include <iostream>
#include <string>
#include <math.h>
#include <iomanip>
#include <stack>
using namespace std;
int getnum(string s,int &i)
{
int sum=0;
while(s[i]>='0'&&s[i]<='9')
{
sum=sum*10+s[i]-'0';
i++;
}
return sum;
}
void func()
{
string s;
while(cin>>s)
{
int flag=1;
int a,b,c;
a=b=c=0;
stack<int> st;
for(int i=0;i<s.size();)
{
if(s[i]>='0'&&s[i]<='9')// 数字先存下来
{
int t=getnum(s,i);
st.push(flag*t);
}else
if(s[i]=='x'&&s[i+1]=='^')// 二次项
{
// 系数没有数字,即为1的情况
if(s[i-1]<'0'||s[i-1]>'9')
{
st.push(flag);
}
int t=st.top();
st.pop();
a+=t;
i++;//^
i++;//2
i++;// 下一个符号
}else
if(s[i]=='x'&&s[i+1]!='^')// 一次项
{
// 系数没有数字,即为1的情况
if(s[i-1]<'0'||s[i-1]>'9')
{
st.push(flag);
}
int t=st.top();
st.pop();
b+=t;
i++;// 下一个符号
}else
if(s[i]=='+')
{
flag=1;
i++;
}else
if(s[i]=='-')
{
flag=-1;
i++;
} else
if(s[i]=='=')
{
int tmp=0;
while(!st.empty())
{
tmp+=st.top();
st.pop();
}
c+=tmp;
a=0-a;
b=0-b;
c=0-c;
i++;
}
}
int tmp=0;
while(!st.empty())
{
tmp+=st.top();
st.pop();
}
c+=tmp;
if(a<0)
{
a=0-a;
b=0-b;
c=0-c;
}
double x1,x2;
double delta=b*b-4*a*c;
if(delta<0)
cout<<"No Solution"<<endl;
else{
x1=((-1)*(double)b-sqrt(delta))/a/2;
x2=((-1)*(double)b+sqrt(delta))/a/2;
cout.setf(ios::fixed);
cout.precision(2);
cout<<x1<<" "<<x2<<endl;
}
}
}
int main(int argc, char *argv[])
{
//printf("Hello, world\n");
func();
return 0;
}
使用栈,同时要注意一些表达式上的细节
1.=号左右两边的问题
2.没有系数的情况实际上是系数为1
-
题目描述:
-
设计一个二次方程计算器
-
输入:
-
每个案例是关于x的一个二次方程表达式,为了简单,每个系数都是整数形式。
-
输出:
-
每个案例输出两个实数(由小到大输出,中间由空格隔开),保留两位小数;如果无解,则输出“No Solution”。
-
样例输入:
-
x^2+x=3x+4
-
样例输出:
-
-1.24 3.24