题目

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

思路

本题要求:读入一元二次方程系数 a,b,c,按判别式 Δ 讨论根的情况。

a==0,方程退化为一次式,单独处理。否则计算 delta = b*b - 4*a*c:Δ>0 有两个不等实根,Δ=0 有重根,Δ<0 无实根。求根时用 doublesqrt,输出保留两位小数。

解题分析

先判 a==0 退化成一次方程。否则算 Δ=b²-4ac:Δ>0 两不等实根,Δ=0 重根,Δ<0 无实根。浮点比较 Δ 与 0 时,本题用 ==0 可接受,工程上常加 epsilon。

  • 输出根用 sqrt,链接数学库 -lm(本地 gcc 常见)。
  • 分母 2*a 在 a≠0 时已保证非零。

函数简要说明

本题求一元二次方程实根时要用数学库(需 #include <math.h>,部分环境链接加 -lm):

  • sqrt(x):非负实数的平方根,返回 double。求根公式里当 Δ≥0 时用 sqrt(delta)
  • fabs(x)(可选):浮点绝对值;比较 Δ 与 0 时若担心误差可用,本题直接 delta == 0 即可。
  • 系数、根建议用 doubleprintf("%.2f", x) 控制两位小数输出。

完整程序

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

int main(void)
{
    double a, b, c;
    if (scanf("%lf %lf %lf", &a, &b, &c) != 3) {
        return 1;
    }
    if (a == 0.0) {
        printf("不是二次方程\n");
        return 0;
    }
    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 {
        printf("无实根\n");
    }
    return 0;
}

运行示例

输入:

1 -3 2

输出:

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