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);
        }
    }
}
posted @ 2022-02-06 11:13  cycwss  阅读(60)  评论(0)    收藏  举报