CF20B Equation 题解

题意

求解形如 \(ax^2+bx+c=0\) 的方程。

分析

通过读题发现,可以分成几种情况:

  1. \(a=0,b=0,c=0\)

    此时方程有无数个解。

  2. \(a=0,b=0,c \neq 0\)

    此时方程无解。

  3. \(a=0,b \neq 0\)

    此时方程有唯一解 \(-\frac{c}{b}\)

  4. \(a \neq 0,\Delta>0\)

    根据一元二次方程求根公式,此时方程有不相等的两个解 \(x=\frac{-b \pm \sqrt{b^2-4ac}}{2a}\),注意从小到大输出。

  5. \(a \neq 0,\Delta=0\)

    此时方程有两个相等的解 \(x=\frac{-b + \sqrt{b^2-4ac}}{2a}\)

  6. \(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;
}
posted @ 2022-02-18 11:02  l_x_y  阅读(25)  评论(0编辑  收藏  举报