CF20B Equation 题解
题意
求解形如 \(ax^2+bx+c=0\) 的方程。
分析
通过读题发现,可以分成几种情况:
-
\(a=0,b=0,c=0\)
此时方程有无数个解。
-
\(a=0,b=0,c \neq 0\)
此时方程无解。
-
\(a=0,b \neq 0\)
此时方程有唯一解 \(-\frac{c}{b}\)。
-
\(a \neq 0,\Delta>0\)
根据一元二次方程求根公式,此时方程有不相等的两个解 \(x=\frac{-b \pm \sqrt{b^2-4ac}}{2a}\),注意从小到大输出。
-
\(a \neq 0,\Delta=0\)
此时方程有两个相等的解 \(x=\frac{-b + \sqrt{b^2-4ac}}{2a}\)。
-
\(a \neq 0,\Delta<0\)
此时方程无解。
代码
#include <bits/stdc++.h>
using namespace std;
inline void qread(){}template<class T1,class ...T2>
inline void qread(T1 &IEE,T2&... ls)
{
register T1 x=0;register bool f=false;char ch=getchar();
while(ch<'0') f|=(ch=='-'),ch=getchar();
while(ch>='0') x=(x*10)+(ch^48),ch=getchar();
x=(f?-x:x);IEE=x;qread(ls...);
}
long long a,b,c;
int main()
{
qread(a,b,c);
double d=b*b-4*a*c;
if(a==0)
{
if(b==0)
{
if(c==0) printf("-1\n");
else printf("0\n");
}
else printf("1\n%.10lf\n",-c/1.0/b);
}
else
{
if(d>0) printf("2\n%.10lf\n%.10lf\n",min((-b-sqrt(d))/2.0/a,(-b+sqrt(d))/2.0/a),max((-b-sqrt(d))/2.0/a,(-b+sqrt(d))/2.0/a));
else if(fabs(d)<=1e-8) printf("1\n%.10lf\n",(-b+sqrt(d))/2.0/a);
else printf("0\n");
}
return 0;
}