题目

读入系数 a、b、c,讨论 Δ 三种情况并输出相应结论或实根(保留两位小数)。

输入格式:一行输入三个浮点数 a、b、c,以空格分隔。

输出格式:根据根的情况输出对应结论。有两个不等实根时保留两位小数输出 x1 和 x2;有重根时输出 x;无实根时输出 无实根。

数据范围与约定:系数 a, b, c 均为 double 精度浮点数。

思路与算法

1. 一元二次方程判别式
对于方程 ax² + bx + c = 0(a ≠ 0):
判别式 Δ = b² - 4ac。
① Δ > 0:有两个不等实根,公式为 (-b ± √Δ) / (2a);
② Δ = 0:有两个相等实根(重根),x = -b / (2a);
③ Δ < 0:在实数范围内无实数根。

2. 异常退化场景
当二次项系数 a == 0 时,方程退化为一元一次方程,不再属于一元二次方程范畴,需先行拦截判定。

3. 浮点运算与数学库
调用 sqrt() 开平方函数需引入 #include <math.h>。浮点除法需注意分母写成 2.0 * a。输出使用 %.2f 精确控制两位小数。

完整程序

#include <stdio.h>
#include <math.h>

int main(void)
{
    double a, b, c;
    if (scanf("%lf %lf %lf", &a, &b, &c) != 3) {
        return 1;
    }

    // 二次方程前提:二次项系数 a 不能为 0
    if (a == 0.0) {
        printf("不是二次方程\n");
        return 0;
    }

    // 计算根的判别式 Δ = b² - 4ac
    double delta = b * b - 4.0 * a * c;
    if (delta > 0) {
        // 存在两个不等实根
        double x1 = (-b + sqrt(delta)) / (2.0 * a);
        double x2 = (-b - sqrt(delta)) / (2.0 * a);
        printf("两个不等实根: x1=%.2f, x2=%.2f\n", x1, x2);
    } else if (delta == 0) {
        // 存在两个相等实根(重根)
        double x = -b / (2.0 * a);
        printf("两个相等实根: x=%.2f\n", x);
    } else {
        // Δ < 0 时在实数范围内无解
        printf("无实根\n");
    }
    return 0;
}

运行示例

输入:

1 -3 2

输出:

两个不等实根: x1=2.00, x2=1.00