求一元二次方程的根(包含对∆的讨论)

问题描述

假设有形如:ax2+bx+c=0的一元二次方程,其中a,b,c是任意实数且满足a≠0,请编写一段程序,根据用户输入的a,b,c的值,计算并输出一元二次方程的根。

输入

三个用空格分开的实数,分别表示一元二次方程中的三个系数。 输入数据保证满足条件a≠0。

输出

输出只有一行,即方程的根。 若方程有两个相同的实根,则输出:x1=x2=...; 若方程有两个不相同的实根,则输出:x1=...;x2=...,其中x1>x2; 若方程没有实根,则输出:x1=实部+虚部i;x2=实部-虚部i,其中,实部为0时不能省略,并且必须保证x1的虚部为非负数。 所有实数部分要求精确到小数点后5位,数字、符号之间没有空格。

输入示例

1.0 2.0 8.0

输出示例

x1=-1.00000+2.64575i;x2=-1.00000-2.64575i

我们要考虑方程根的情况,分为三种∆>0,∆<0,∆=0.

1.∆>0

有两个不相等的实根

2.∆<0

两个的复数根。

3.∆=0

有两个相等的实根。

#include<stdio.h>

#include<math.h>

int main(void)

{

    double a,b,c;

    scanf("%lf %lf %lf",&a,&b,&c);

    if(b*b-4*a*c==0)

    {

        printf("x1=x2=%.5lf",-b/(2*a));

    }

    if(b*b-4*a*c>0)

    {

        if((-b+sqrt(fabs(b*b-4*a*c)))/(2*a)>(-b-sqrt(fabs(b*b-4*a*c)))/(2*a))

            printf("x1=%.5lf;x2=%.5lf",(-b+sqrt(fabs(b*b-4*a*c)))/(2*a),(-b-sqrt(fabs(b*b-4*a*c)))/(2*a));

        if((-b+sqrt(fabs(b*b-4*a*c)))/(2*a)<=(-b-sqrt(fabs(b*b-4*a*c)))/(2*a))

            printf("x1=%.5lf;x2=%.5lf",(-b-sqrt(fabs(b*b-4*a*c)))/(2*a),(-b+sqrt(fabs(b*b-4*a*c)))/(2*a));

    }

    if(b*b-4*a*c<0)

    {

        if(b==0)

        {

            printf("x1=0.00000+%.5lfi;x2=0.00000-%.5lfi",sqrt(4*a*c-b*b)/fabs(2*a),sqrt(4*a*c-b*b)/fabs(2*a));

        }

        else

        {

            printf("x1=%.5lf+%.5lfi;x2=%.5lf-%.5lfi",-b/(2*a),sqrt(4*a*c-b*b)/fabs(2*a),-b/(2*a),sqrt(4*a*c-b*b)/fabs(2*a));

        }

    return 0;

    }

}

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值