CF20B题解
题目大意
给一个形如 \(ax^2+bx+c\) 的方程,求解的数量与解的值。
分析
一些一元二次方程的必备知识。
定义:形如 \(ax^2+bx+c=0\) 的方程,其中 \(a\ne0\) 。这样的方程叫一元二次方程。
下面来演示一元二次方程的推导过程。
移项,得
\[ax^2+bx=-c
\]
二次项系数化为 \(1\),得
\[x^2+\frac{b}{a}x=-\frac{c}{a}
\]
两边加 \((\dfrac{b}{2a})^2\) (即配方法),得
\[x^2+\frac{b}{a}x+(\frac{b}{2a})^2=-\frac{c}{a}+(\frac{b}{2a})^2
\]
左边写成完全平方形式,右边通分,即
\[(x+\frac{b}{2a})^2=\frac{b^2-4ac}{4a^2}
\]
而式子 \(b^2-4ac\) 的值有三种情况:
(1) \(b^2-4ac>0\)
此时
\[x+\frac{b}{2a}=\pm\frac{\sqrt{b^2-4ac}}{2a}
\]
移项,得
\[x=\frac{-b\pm\sqrt{b^2-4ac}}{2a}
\]
所以此时方程有两个不相同的实数范围内的解
\[x_1=\frac{-b+\sqrt{b^2-4ac}}{2a},x_2=\frac{-b-\sqrt{b^2-4ac}}{2a}
\]
(2) \(b^2-4ac=0\)
此时 \(\dfrac{b^2-4ac}{4a^2}=0\) ,所以方程有一个实数范围内的解
\[x=-\frac{b}{2a}
\]
(3) \(b^2-4ac<0\)
此时 \((x+\dfrac{b}{2a})^2<0\),所以方程无实数范围内的解。
解题
输入数据不一定是一元二次方程,因为没有保证 \(a\ne0\) 。
所以我们要加入特判。
\(1.a=0,b=0,c=0\)
此时方程有无数解。
\(2.a=0,b=0,c\ne0\)
此时方程无解。
\(3.a=0,b\ne0\)
此时为一元一次方程,解为 \(\dfrac{-c}{b}\) 。
\(4.a=0,c=0\)
此时方程的解为 \(0\) 。
\(5.a\ne0,b=0,c=0\)
此时方程为 \(ax^2=0\) ,解得 \(x=0\) 。
剩下的就是一元二次方程了。
代码
#include<bits/stdc++.h>
using namespace std;
double a,b,c,x1,x2;
void print(double u){ //输出
if(u==-0.0000000000) u=0.0000000000;
printf("%.10lf\n",u);
}
int main(){
cin>>a>>b>>c;
if(!a&&!b&&!c) cout<<-1;
else if(!a&&!b&&c) cout<<0;
else if(!a&&b){
x1=(-c)/b;
cout<<"1\n";
print(x1);
}
else if(!a&&!c) cout<<"1\n",print(0);
else if(a&&!b&&!c) cout<<"1\n",print(0);
else{
double d=b*b-4*a*c;
if(d<0) cout<<0;
else if(d==0) cout<<"1\n",print(-b/(2*a));
else{
x1=(-b+sqrt(d))/(2*a);
x2=(-b-sqrt(d))/(2*a);
if(x2<x1) swap(x1,x2);
cout<<"2\n",print(x1),print(x2);
}
}
}