求解一元三次方程问题用c++代码实现
时间: 2023-09-04 10:16:43 浏览: 187
好的,以下是求解一元三次方程问题的 C 代码实现:
```c
#include <stdio.h>
#include <math.h>
int main() {
float a, b, c, d;
float x1, x2, x3;
float p, q;
printf("请依次输入一元三次方程的系数:\n");
scanf("%f %f %f %f", &a, &b, &c, &d);
// 计算判别式
p = b*b - 3*a*c;
q = 2*b*b*b - 9*a*b*c + 27*a*a*d;
float delta = q*q - 4*p*p*p;
float u, v, w;
// 判断判别式的正负性
if (delta > 0) {
u = cbrt((q + sqrt(delta)) / 2);
v = cbrt((q - sqrt(delta)) / 2);
x1 = u + v - b/(3*a);
printf("该一元三次方程有一个实根:x=%f\n", x1);
}
else if (delta == 0) {
if (q != 0) {
u = cbrt(q/2);
x1 = 2*u - b/(3*a);
x2 = -u - b/(3*a);
printf("该一元三次方程有一重实根:x=%f 和一个实根:x=%f\n", x1, x2);
}
else {
x1 = cbrt(d/a);
printf("该一元三次方程有三重实根:x=%f\n", x1);
}
}
else {
u = cbrt((sqrt(-delta) + q) / 2);
v = cbrt((-sqrt(-delta) + q) / 2);
w = -1.0/2 + sqrt(3)*I/2;
x1 = (u + v - b/(3*a));
x2 = (-1*(u + v)/2 - b/(3*a)) + (w*(u - v));
x3 = (-1*(u + v)/2 - b/(3*a)) - (w*(u - v));
printf("该一元三次方程有三个复根:x1=%f+%f*i,x2=%f+%f*i,x3=%f+%f*i\n", crealf(x1), cimagf(x1), crealf(x2), cimagf(x2), crealf(x3), cimagf(x3));
}
return 0;
}
```
希望对您有帮助。
阅读全文