题目
读入系数 a、b、c,讨论 Δ 三种情况并输出相应结论或实根(保留两位小数)。
思路
本题要求:读入一元二次方程系数 a,b,c,按判别式 Δ 讨论根的情况。
若 a==0,方程退化为一次式,单独处理。否则计算 delta = b*b - 4*a*c:Δ>0 有两个不等实根,Δ=0 有重根,Δ<0 无实根。求根时用 double 和 sqrt,输出保留两位小数。
解题分析
先判 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即可。- 系数、根建议用
double,printf("%.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