一元二次方程求解

   一元二次方程的一般形式为 ax^2 + bx + c = 0,其中a!=0。

   一元二次方程的解法主要有两种:公式法和因式分解法,但因式分解法只能用于特殊的一元二次方程,而公式法具有普遍性,所以编写程序时使用公式法来对方程进行求解。

   公式法主要应用韦达定理:x_{1,2}=\frac{-b\pm \sqrt{b^{2}-4ac}}{2a},其中\bigtriangleup=b^{2}-4ac称为判别式,

当 \bigtriangleup>0 时,方程有两个不相等的实根;当 \bigtriangleup=0 时,方程有两个相等的实根(即重根);

当 \bigtriangleup<0 时,方程无实根,但存在两个共轭复根,此时x_{1,2}=\frac{-b\pm i\sqrt{-(b^{2}-4ac)}}{2a}, (注意,此处由于\bigtriangleup<0,所以使用的是 -\bigtriangleup

题目如下:

代码:

#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;
}

    希望能够对大家有帮助

    如果大家有其他的想法和意见,欢迎和我交流

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值