。求一元二次方程a*x*x+b*x+c=0的根,用3个函数分别定义求当:b*b-4ac大于0、等于0和小于0时的根,并输出结果。从主函数main()中输入方程三个系数a、b、c的值。
时间: 2024-11-15 21:25:26 浏览: 23
一元二次方程 \( ax^2 + bx + c = 0 \) 的解取决于判别式 \( D = b^2 - 4ac \),其有三种情况:
1. 当 \( D > 0 \)(即判别式为正),有两个不同的实数根,可以使用公式:
\[ x_1 = \frac{- \sqrt{D}}{2a} \]
2. 当 \( D = 0 \)(即判别式为零),有一个唯一的实数根,也称为重根:
\[ x = -\frac{b}{2a} \]
3. 当 \( D < 0 \)(即判别式为负),方程无实数根,但有两个复数根,一般表示为共轭虚数形式:
\[ x = \frac{-b \pm i\sqrt{|D|}}{2a} \](其中 \( i \) 是虚数单位)
以下是使用 C 语言分别定义这三种情况下的求解函数:
```c
#include <stdio.h>
#include <math.h>
// 求解两个实数根
void solveTwoRealRoots(double a, double b, double c, double *x1, double *x2) {
double discriminant = b * b - 4 * a * c;
if (discriminant > 0) {
*x1 = (-b + sqrt(discriminant)) / (2 * a);
*x2 = (-b - sqrt(discriminant)) / (2 * a);
} else if (discriminant == 0) {
*x1 = *x2 = -b / (2 * a);
}
}
// 求解唯一实数根
void solveOneRealRoot(double a, double b, double c, double *root) {
if (b * b - 4 * a * c == 0) {
*root = -b / (2 * a);
}
}
// 求解一对共轭复数根
void solveComplexRoots(double a, double b, double c, complex_t *realPart, complex_t *imaginaryPart) {
double discriminant = b * b - 4 * a * c;
if (discriminant < 0) {
double absDiscriminant = sqrt(-discriminant);
*realPart = -b / (2 * a);
*imaginaryPart = imagunit * absDiscriminant / (2 * a); // 使用虚数单位 i
}
}
int main() {
double a, b, c;
printf("请输入一元二次方程的系数a, b, c: ");
scanf("%lf %lf %lf", &a, &b, &c);
double x1, x2;
complex_t realPart, imaginaryPart;
solveTwoRealRoots(a, b, c, &x1, &x2);
printf("当D>0时,根为 x1 = %.2f, x2 = %.2f\n", x1, x2);
solveOneRealRoot(a, b, c, &x1);
printf("当D=0时,根为 x = %.2f\n", x1);
solveComplexRoots(a, b, c, &realPart, &imaginaryPart);
printf("当D<0时,根为 x1 = %.2f + %.2fi\n", creal(realPart), cimag(realPart));
return 0;
}
```
在这个程序中,我们假设引入了 `complex.h` 文件来处理复数计算,同时使用了一个 `complex_t` 类型来表示复数。
阅读全文