题目描述
输入描述
每个案例是关于x的一个二次方程表达式,为了简单,每个系数都是整数形式。
输出描述
每个案例输出两个实数(由小到大输出,中间由空格隔开),保留两位小数;如果无解,则输出“No Solution”。
示例
输入
x^2+x=3x+4
输出
-1.24 3.24
解法
形如ax2+bx+c=0的一元二次方程, Δ \Delta Δ=b2-4ac。当 Δ \Delta Δ<0时,方程无实解;当 Δ \Delta Δ>=0时,方程有解,其解为x1= − b + Δ 2 a \frac{-b+ \sqrt\Delta}{2a} 2a−b+Δ, x2=x1= − b − Δ 2 a \frac{-b-\sqrt \Delta}{2a} 2a−b−Δ。
- 将输入方程以等号为界分为左侧和右侧。
- 将两侧的式子都进行分割,形成形如ax2,bx,c的字符串,并将其放入vector中。
- 对vector进行遍历,分离出二次项、一次项、常数项系数,并分别相加。
- 将左侧得到的al,bl,cl与右侧得到的ar,br,cr作差,即可得到形如ax2+bx+c=0中的a,b,c。
- 利用求值公式即可求出方程的解x1,x2。
实现代码
#include <iostream>
#include <vector>
#include <algorithm>
#include<iomanip>
#include <cmath>
using namespace std;
void solution(string s,int &a,int &b,int &c)
{
vector<string> v;
int n=s.length(),begin=0;
//分割
for (int i=0;i<n;i++)
{
if (s[i]=='+')
{
v.push_back(s.substr(begin,i-begin));
begin = i+1;
}
else if (s[i]=='-')
{
v.push_back(s.substr(begin,i-begin));
begin = i;
}
else if(i==n-1)
v.push_back(s.substr(begin,i-begin+1));
}
for (int i=0;i<v.size();i++)
{
if (v[i]=="")
continue;
if (v[i].length()>2&&v[i][v[i].length()-2]=='^')
{
if (v[i][0]=='x')
a += 1;
else if (v[i][0]=='-'&&v[i][1]=='x')
a += -1;
else
a += stoi(v[i].substr(0,v[i].length()-3));
// cout<<"二次系数:"<<a<<endl;
}
else if(v[i][v[i].length()-1]=='x')
{
if (v[i][0]=='x')
b += 1;
else if (v[i][0]=='-'&&v[i][1]=='x')
b += -1;
else
b += stoi(v[i].substr(0,v[i].length()-1));
// cout<<"一次系数:"<<b<<endl;
}
else
{
c += stoi(v[i].substr(0,v[i].length()));
// cout<<"常系数:"<<c<<endl;
}
}
}
// 2x^2+x+6-4x=3x+4
int main ()
{
string s,sright,sleft;
double x1,x2;
while(cin>>s)
{
int n=s.length(),i;
int ar=0,br=0,cr=0,al=0,bl=0,cl=0,a,b,c;
double delta;
for(i=0;i<n&&s[i]!='=';i++);
sright = s.substr(0,i);
sleft = s.substr(i+1,n-i-1);
solution(sright,ar,br,cr);
// cout<<ar<<" "<<br<<" "<<cr<<endl;
solution(sleft,al,bl,cl);
// cout<<al<<" "<<bl<<" "<<cl<<endl;
a = ar-al;
b = br-bl;
c = cr-cl;
delta = b*b-4*a*c;
if (delta<0)
cout<<"No Solution"<<endl;
else
{
x1 = (-b-sqrt(delta))/2/a;
x2 = (-b+sqrt(delta))/2/a;
cout<<fixed<<setprecision(2)<<min(x1,x2)<<" "<<max(x1,x2)<<endl;
}
}
return 0;
}
此代码可以适用于 a 1 x 2 + b 1 x + b 3 x + c 1 = a 2 x 2 + b 2 x + c 2 + c 3 a_1x^2+b_1x+b_3x+c_1=a_2x^2+b_2x+c_2+c_3 a1x2+b1x+b3x+c1=a2x2+b2x+c2+c3此类的非最简式,其中系数可以不为整数。