题目:二元一次方程的形式一般是 ax2+bx+c=0 a x 2 + b x + c = 0 (a不能为0),输入a、b、c,求这个二元一次方程的解。
解题思路:首先我们得清楚二元一次方程求解公式:
x=−b±b2−4ac√2a
x
=
−
b
±
b
2
−
4
a
c
2
a
,其次要清楚二元一次方程的性质。
Δ=b2−4ac−−−−−−−√
Δ
=
b
2
−
4
a
c
①最高项系数不能为0,即(a != 0);
②如果Δ=0,那方程有两个相同的解;
③如果Δ>0,那方程有两个不同的解;
④如果Δ<0,那方程无解。
最后这里要注意,这里定义的变量都是double型的,而double类型变量和0比较不能直接进行,这里我们先定义一个精度EOX,如果一个数落在[-EOX, EOX]这个闭区间内,我们就认为在某个精度内它的值与零值相等。
#define EOX 0.000001
//代码中的数值都是浮点数,如果和int型的0比较大小就会发生错误,所以此处我自己定义了一个精度,(-EXO,EXO)区间代表0
void Equationsolving(double a, double b, double c)
{
if ((a >= -EOX) && (a =< EOX))//如果a在[-EXO,EXO]区间内代表a=0,那就不是一个一元二次方程
printf("这不是一个一元二次方程\n");
else
{
double d = b*b - 4*a*c;
double x1 = (-b + sqrt(d)) / 2 * a; //两个求解的公式
double x2 = (-b - sqrt(d)) / 2 * a;
if (d > EOX) //d大于零,方程有两个不同的解
{
printf("该方程有两个不同的解:x1 = %lf, x2 = %lf\n", x1, x2);
}
else if ((d > -EOX) && (d < EOX)) //d等于零,方程有两个相同的解
{
printf("该方程有两个相同的解:x1 = x2 = %lf\n", x1);
}
else if (d < -EOX)
{
printf("该方程无解\n"); // d小于零,方程无解
}
}
}
int main()
{
printf("请输入要求解的一元二次方程的三个系数a,b,c的值:");
double a = 0;
double b = 0;
double c = 0;
scanf_s("%lf%lf%lf", &a, &b, &c); //从键盘上输入a,b,c的值
Equationsolving(a, b, c);
system("pause");
return 0;
}