1058:求二次方程

1058:求二次方程

时间限制:1000 ms 内存限制:65536 KB

题目描述

利用公式 \(x_1=\frac{-b+\sqrt{b^2-4ac}}{2a}\),\(x_2=\frac{-b-\sqrt{b^2-4ac}}{2a}\),求一元二次方程 \(ax^2+bx+c=0\) 的根,其中 \(a \ne 0\)。 结果要求精确到小数点后 5 位。

输入

输入一行,包含三个浮点数 \(a,b,c\)(它们之间以一个空格分开),分别表示方程 \(ax^2+bx+c=0\) 的系数。

输出

  • 输出一行,表示方程的解。
  • 若两个实根相等,输出形式为:x1=x2=...
  • 若两个实根不等,且根小者在前,输出形式为:x1=...;x2=...
  • 若无实根,输出 No answer!

所有输出部分要求精确到小数点后 5 位,数字、符号之间没有空格。

输入样例

-15.97 19.69 12.02

输出样例

x1=-0.44781;x2=1.68075

说明

按判别式 \(\Delta = b^2 - 4ac\) 判断根的情况:

  • \(\Delta < 0\):无实根;
  • \(\Delta = 0\):有且仅有一个实根(重根);
  • \(\Delta > 0\):有两个不相等的实根,按从小到大输出。
#include<iostream>
#include<cmath>
#include<iomanip>
using namespace std;
int main() {
    double a = 0, b = 0, c = 0;
    cin >> a >> b >> c;
    cout << fixed << setprecision(5);
    double delta = (b * b - 4 * a * c);
    if (delta < 0) {
        cout << "No answer!";
    }
    else {
        double x1 = (-b + pow(delta, 0.5)) / (2 * a);
        double x2 = (-b - pow(delta, 0.5)) / (2 * a);
        if (delta > 0) {
            cout << "x1=" << min(x1, x2) << ";x2=" << max(x1, x2);
        }
        else if (delta == 0) {
            cout << "x1=x2=" << x1;
        }

    }
    return 0;
}