CodeForces 20B 题解
题解笔记
CF20B Equation(Equation.cpp)
时间限制 \(1s\) | 内存限制 \(256M\)
题目描述:
给出一个形如 \(ax^2+bx+c=0\) 的方程,问有多少个实数解。
输入格式:
仅有一行,包含三个整数 \(a,b,c\) (\(−105 \leq a,b,c \leq 105\)) 。
输出格式:
如果有无数个解,输出 \(−1\) ,否则,先在第一行输出一个整数 \(k\) ,表示所给方程有 \(k\) 个解,接下来 \(k\) 行,每行一个数,表示一个解,按从小到大的顺序输出。结果至少保留六位小数。
输入输出样例:
样例1输入 | 样例1输出 |
---|---|
1 -5 6 | 2 2.0000000000 3.0000000000 |
解题思路:
一道很简单的数论,但需要注意一下审题。题目只说了是一个这样的方程,并没有说是一元二次方程,所以需要判断 \(a,b\) 是否为 \(0\) 。 另外,记得要开 long long
。
另外科普一下一元二次方程的判根式:
\[\Delta = b^2-4ac
\]
如果 \(\Delta < 0\) ,那么方程在实数范围内无解;如果 \(\Delta>0\) ,那么方程有两个不同的实数解;如果 \(\Delta = 0\) ,那么方程只有一个实数解
同时方程的两个解 \(x_1,x_2\) 为:
\[x1=\dfrac{-b+\sqrt{\Delta}}{2a}\\
x2=\dfrac{-b-\sqrt{\Delta}}{2a}
\]
参考代码:
#include<iostream>
#include<cstring>
#include<string>
#include<cmath>
using namespace std;
typedef long long ll;
int main(){
ll a,b,c;
scanf("%lld%lld%lld",&a,&b,&c);
ll x=b*b-4*a*c;
if(a==0&&b==0)
{
if(c) printf("0");
else printf("-1");
}
else if(a==0) printf("1\n%.10lf",double(-c)/b);
else if(x==0) printf("1\n%.10lf",double(-b)/(2*a));
else if(x<0) printf("0");
else
{
double sqrtx=sqrt(x);
if(a>0) printf("2\n%.10lf\n%.10lf",double(-b-sqrtx)/(2*a),double(-b+sqrtx)/(2*a));
else if(a<0) printf("2\n%.10lf\n%.10lf",double(-b+sqrtx)/(2*a),double(-b-sqrtx)/(2*a));
}
return 0;
}