牛客网刷题 | BC73 计算一元二次方程

目前主要分为三个专栏,后续还会添加:

        专栏如下:                 C语言刷题解析       C语言系列文章       我的成长经历

感谢阅读!

初来乍到,如有错误请指出,感谢!


 描述

从键盘输入a, b, c的值,编程计算并输出一元二次方程ax2 + bx + c = 0的根,当a = 0时,输出“Not quadratic equation”,当a ≠ 0时,根据△ = b2 - 4*a*c的三种情况计算并输出方程的根。

输入描述:

多组输入,一行,包含三个浮点数a, b, c,以一个空格分隔,表示一元二次方程ax2 + bx + c = 0的系数。

输出描述:

针对每组输入,输出一行,输出一元二次方程ax2 + bx +c = 0的根的情况。

  如果a = 0,输出“Not quadratic equation”;

  如果a ≠  0,分三种情况:

△ = 0,则两个实根相等,输出形式为:x1=x2=...

△  > 0,则两个实根不等,输出形式为:x1=...;x2=...,其中x1  <=  x2。

△  < 0,则有两个虚根,则输出:x1=实部-虚部i;x2=实部+虚部i

即x1的虚部系数小于等于x2的虚部系数,实部为0时不可省略。

实部= -b / (2*a),虚部= sqrt(-△ ) / (2*a)

所有实数部分要求精确到小数点后2位,数字、符号之间没有空格。


思路 : 

使用sqrt函数求平方

按照公式一步一步去写程序

AI 解题思路


代码 1 :

# include <stdio.h>
# include <math.h>//会用到sqrt函数

void check_equation(float a,float b,float c)

{
    float x1=0,x2=0;
   
    if(a==0) //两个根
    {
        printf("Not quadratic equation\n");
    }
    else //a不为0的情况

    {
        float M =(b*b)-4*a*c;//后面不用计算,提升效率,判断式

    //定义变量,用来判断b2 - 4*a*c是否等于0
    /*
    if (a==0) 
    {
        printf("Not quadratic equation\n");
    }
    else//a不为0的情况
    */
    
        if (M==0) //两根相等
        {
            float x = b/(-2*a);//相等的求跟公式
            if(x == 0)         //x等于0.00时总是以-0.00显示
            {
                printf("x1=x2=0.00\n");
            }
            else 
            {
                printf("x1=x2=%.2f\n",x);
            }
        }
        else if (M>0)       //两根为实根 
        {
            x1 = (-b+sqrt(M))/(2*a);
            x2 = (-b-sqrt(M))/(2*a);    //求根公式
            if (x1<=x2) //小的根一定在前面
            {
                printf("x1=%.2f;x2=%.2f\n",x1,x2);
            }
            else 
            {
                printf("x1=%.2f;x2=%.2f\n",x2,x1);
            }
        }
        else //两个为虚根
        {
            float shi = -b/(2*a);//虚部,虚部和实部不能相加
            float xu = sqrt(-M)/(2*a);//一定是正数
            //直接打印
            //因为虚部显示是相反数,而xu一定为正数
            //所以x1 一定是“-”减号字符,x2一定是“+”加号字符
            printf("x1=%.2f-%.2fi;x2=%.2f+%.2fi",shi,xu,shi,xu);
        }
    }
 }

int main ()

{
    float a,b,c;
    //定义变量
    while (scanf("%f %f %f",&a,&b,&c)!=EOF) //如果在成功读取任何数据之前发生任何情况
                                            //则返回 EOF。
    {
        check_equation(a,b,c);//求根函数
    }

    return 0;
}

代码 2 :

#include <stdio.h>
#include <math.h>

int main()
{
    //因子
	float a = 0.0f;
	float b = 0.0f;
	float c = 0.0f;
	//判别式
    float disc = 0.0f;
    //实数根
    float root1 = 0.0f;
	float root2 = 0.0f;
	//共轭复数的实部与虚部
    float real = 0.0f;
	float imag = 0.0f;

    //录入数据
    while(scanf("%f%f%f", &a, &b, &c) == 3)
    {
        //判断是否为一元二次方程
        if(a == 0.0)
        {
            printf("Not quadratic equation\n");
            continue;
        }
        
        //求根公式的判别式
        disc = b * b - 4 * a * c;
        
        //进入求根流程
        if (disc <= 1e-6 && disc >= -1e-6)//有2个相同实数根
        {
            root1 = (-b + sqrt(disc)) / (2 * a);

            //消除-0.0的情况
            if(root1 <= 1e-6 && root1 >= -1e-6)
            {
                root1 = root2 = 0.0; 
            }

            printf("x1=x2=%.2f\n", root1);
        }
        else if (disc > 0.0)//有2个不同实数根
        {
            root1 = (-b - sqrt(disc)) / 2 / a;
            root2 = (-b + sqrt(disc)) / 2 / a;
            
            printf("x1=%.2f;x2=%.2f\n", root1, root2);
        }
        else//有2个共轭复数根
        {
            real = -b / 2 / a;
            imag = sqrt(-disc) / 2 / a;

            printf("x1=%.2f-%.2fi;x2=%.2f+%.2fi\n", real, imag, real, imag);
        }
    }

	return 0;
}

代码 3 :

#include <stdio.h>
#include <math.h>

int main() {
    double a, b, c, root, x1, x2;
    while (scanf("%lf %lf %lf", &a, &b, &c) != EOF) {
        getchar();
        if (a == 0) {
            printf("Not quadratic equation\n");
        } else if (a != 0) {
            root = pow(b, 2) - (4 * a * c);
            // 两个根相等
            if (root == 0) {
                // 求根公式
                x1 = ((-b) + sqrt(root)) / (2 * a);
                // 将-0.00变为0
                x1 == 0 ? x1 = 0 : x1;
                printf("x1=x2=%.2lf\n", x1);
            }
            // 两个根不等
            else if (root > 0) {
                // 求根公式
                double temp;
                x1 = ((-b) + sqrt(root)) / (2 * a);
                x2 = ((-b) - sqrt(root)) / (2 * a);
                // 检测x1 <= x2?
                x1 <= x2 ?
                printf("x1=%.2lf;x2=%.2lf\n", x1, x2) :
                printf("x1=%.2lf;x2=%.2lf\n", x2, x1);
            }
            // 两个虚根
            else if (root < 0) {
                // 求虚根1的实部x1,虚部x2
                x1 = (-b) / (2 * a);
                x2 = sqrt(-root) / (2 * a);
                printf("x1=%.2lf-%.2lfi;", x1, x2);
                // 求虚根2的实部x1,虚部x2
                x1 = (-b) / (2 * a);
                x2 = sqrt(-root) / (2 * a);
                printf("x2=%.2lf+%.2lfi\n", x1, x2);
            }

        }
    }

    return 0;
}


扩展 : C 库函数 - sqrt()

描述

C 库函数 double sqrt(double x) 返回 x 的平方根。

声明

下面是 sqrt() 函数的声明。

double sqrt(double x)

参数

  • x -- 浮点值。

返回值

该函数返回 x 的平方根。

实例

下面的实例演示了 sqrt() 函数的用法。

#include <stdio.h>
#include <math.h>

int main ()
{

   printf("%lf 的平方根是 %lf\n", 4.0, sqrt(4.0) );
   printf("%lf 的平方根是 %lf\n", 5.0, sqrt(5.0) );
   
   return(0);
}

让我们编译并运行上面的程序,这将产生以下结果:

4.000000 的平方根是 2.000000
5.000000 的平方根是 2.236068

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值