这是我试图获得这个方程的实数和复数值的代码,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
在它的域之外- 如果编译器通过将
x1
和x2
定义为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:(。