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;
}

posted @ 2021-11-12 20:34  yhang323  阅读(19)  评论(0编辑  收藏  举报