C程序求解二次方程(ax^2+bx+C=0)的实根和复根

  • 本文关键字:2+bx+C 程序 二次方程 ax c math
  • 更新时间 :
  • 英文 :


这是我试图获得这个方程的实数和复数值的代码,ax^2+bx+c=0。

#include <math.h>
#include <stdio.h>
int main() {
double a, b, c, d, x1, x2, i = sqrt(-1);
scanf("%lf %lf %lf", &a, &b, &c);
d = (b * b) - (4 * a * c);
x1 = (-b + sqrt(d)) / (a + a);
x2 = (-b - sqrt(d)) / (a + a);
if (d < 0) {
printf("Complex solutionn");
printf("R1 = %.2lfn", x1);
printf("R2 = %.2lfn", x2);
} else
if (a == 0)
printf("Value of a must be non zeron");
else {
printf("R1 = %.2lfn", x1);
printf("R2 = %.2lfn", x2);
}
return 0;
}

我想用i(例如:-.4 + 4i(得到一个答案。

使用<complex.h>

#include <complex.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
int cprint(const char *pre, complex double x, const char *post) {
int n = printf("%s", pre);
n += printf("%.2f", creal(x));
if (cimag(x)) n += printf(" %+.2fi", cimag(x));
n += printf("%s", post);
return n;
}
int main(void) {
double a, b, c, d;
complex double x1, x2;
if (scanf("%lf%lf%lf", &a, &b, &c) != 3) {
printf("Bad inputn");
exit(EXIT_FAILURE);
}
if (a == 0) {
printf("Value of a must be non zeron");
exit(EXIT_FAILURE);
}
d = (b * b) - (4 * a * c);
x1 = (-b + csqrt(d)) / (a + a); // using csqrt()
x2 = (-b - csqrt(d)) / (a + a); // complex square root
if (d < 0) {
printf("Complex solutionn");
}
cprint("R1 = ", x1, "n");
cprint("R2 = ", x2, "n");
return 0;
}

您可以自己计算复杂部分:

#include<stdio.h>
#include<math.h>
int main()
{
double a,b,c;
scanf("%lf %lf %lf",&a,&b,&c);
if (a==0)
{
printf("Value of a must be non zeron");
return 0;
}
double d = (b*b)-(4*a*c);

if (d<0){
double imag = sqrt(-d)/(a+a);
double real = -b/(a+a);
printf("Complex solutionn");
printf("R1 = %.2f + i * %.2fn",real, imag);
printf("R2 = %.2f - i * %.2fn",real, imag);

}
else
{
double x1 = (-b + sqrt(d))/(a+a);
double x2 = (-b - sqrt(d))/(a+a);
printf("R1 = %.2fn",x1);
printf("R2 = %.2fn",x2);
}
return 0;
}

https://ideone.com/R7UwhG

您的程序存在多个问题:

  • sqrt()是实函数,-1在它的域之外
  • 如果编译器通过将x1x2定义为complex double x1, x2;来支持复数,则可以使用它们。但是,自己计算复杂的组件也同样容易
  • 您应该检查scanf()的返回值以检测无效输入
  • 如果a == 0,则方程变为一阶方程,其可能具有解,也可能不具有解

这是一个修改后的版本:

#include <math.h>
#include <stdio.h>
int main() {
double a, b, c, d;
if (scanf("%lf %lf %lf", &a, &b, &c) != 3) {
printf("Invalid inputn");
return 1;
}
if (a == 0) {
printf("Value of a must be non zeron");
if (b == 0) {
if (c == 0) {
printf("Equality is true for all values of xn");
} else {
printf("No solutionn");
}
} else {
double x = (-c) / b;
printf("Single solutionn");
printf("R1 = %.2fn", x);
}
return 0;
}
d = (b * b) - (4 * a * c);
if (d < 0) {
double x = (-b) / (a + a);
double y = fabs(sqrt(-d) / (a + a));

printf("Complex solutionsn");
printf("R1 = %.2f - %.2fin", x, y);
printf("R2 = %.2f + %.2fin", x, y);
} else
if (d == 0) {
double x = (-b) / (a + a);
printf("Single real solutionn");
printf("R1 = %.2fn", x);
} else {
double x1 = (-b + sqrt(d)) / (a + a);
double x2 = (-b - sqrt(d)) / (a + a);
printf("Real solutionsn");
printf("R1 = %.2fn", x1);
printf("R2 = %.2fn", x2);
}
return 0;
}

当您将变量声明为double时,您声明的是实数,而不是复数。要声明和使用复数,请使用库complex.h,如"如何在C中使用复数?"中所述?。

好吧,让我们谈谈二次方程:

术语b2-4ac被称为二次方程的判别式。判别式告诉了根的性质。

  • 如果判别式大于0,则根是真实的并且不同
  • 如果判别式等于0,则根是实的并且相等
  • 如果判别式小于0,则根是复杂且不同的

我想如果我们遵循数学,你可以为此编写一个平滑的代码。

但作为一个小提示,你可以在这里找到更多关于二次方程的解释,以及如何实现C程序来求解它:https://www.programiz.com/cpp-programming/examples/quadratic-roots:(。

最新更新