一元二次方程的一般形式为 ax^2 + bx + c = 0,其中a!=0。
一元二次方程的解法主要有两种:公式法和因式分解法,但因式分解法只能用于特殊的一元二次方程,而公式法具有普遍性,所以编写程序时使用公式法来对方程进行求解。
公式法主要应用韦达定理:,其中
=
称为判别式,
当 >0 时,方程有两个不相等的实根;当
=0 时,方程有两个相等的实根(即重根);
当 <0 时,方程无实根,但存在两个共轭复根,此时
, (注意,此处由于
<0,所以使用的是
。
题目如下:
代码:
#include<stdio.h>
#include<math.h> //引用开方函数sqrt所需头文件
int main()
{
double a, b, c;//系数定义,因为方程式的系数、根不一定为整数,所以均采用double类型
double sign;// 判别式
while (scanf("%lf %lf %lf", &a, &b, &c) != EOF)//输入系数,终止条件为3个Ctrl+Z,每个分
//别占一行
{
if (a == b && a == c && a == 0) //当系数均为0时,方程式为0方程式
{ // Equation——方程式的意思
printf("Zero Equation\n");
}
else if (a == b && a == 0 && c != 0)//当a=b=0,c!=0时,等式并不成立
{
printf("Not An Equation\n");
}
else //排除以上两种情况,就是正常的方程式了
{
double x1, x2;//一元二次方程至多就是两个解x1,x2
sign = b * b - 4.0 * a * c;//判别式
if (a != 0)//a!=0时,方程为一元二次,当a=0时,方程则为一元一次
{
if (sign > 0)//判别式大于0,方程有两个不相等实根
{
double temp; //临时变量temp,用于保持x1始终大于x2
x1 = (-1.0 * b +sqrt(sign) )/ (2.0 * a);//套用公式求解
x2 = (-1.0 * b - sqrt(sign)) / (2.0 * a);
if (x2 > x1) //若x2>x1,交换二者,保持x1始终大于x2
{
temp = x1; x1 = x2; x2 = temp;
}
printf("%.2lf\n%.2lf\n", x1, x2);//输出方程的根,保留两位小数
}
else if (sign == 0) //判别式等于0,方程有两个相等实根
{
x1 = -1.0 * b / (2 * a); //套公式
printf("%.2lf\n", x1); //输出
}
else //判别式小于0,方程无实根,两个根为共轭复数
{
double x=sqrt(-sign) / (2.0 * a); //x为复数的虚部,注意此时判别式加负号
x1 = -1.0 * b / (2.0 * a); //x1为复数实部
//共轭复数实部相同,虚部相反,所以其大小取决于虚部的正负
if (a > 0) //通过公式,a>0时,虚部为正,a<0时,虚部为负
{
printf("%.2lf+%.2lfi\n%.2lf-%.2lfi\n", x1, x, x1, x);
}//虚部为正,所以直接使用
else
{
printf("%.2lf+%.2lfi\n%.2lf-%.2lfi\n", x1, -1.0 * x, x1, x);
}//虚部为负,所以需要在其中之一乘上-1
}
}
else //当a=0时,则为一元一次方程,直接求解
{
x1 = -1.0 * c / b;
printf("%.2lf\n", x1);
}
}
}
return 0;
}
希望能够对大家有帮助
如果大家有其他的想法和意见,欢迎和我交流