解一元二次方程

请编写程序,解一元一次方程 ax2+bx+c=0 。

已知一元二次方程的求根公式为:

 

30946087710fcaab595350d25b620181.jpeg

要求:

(1) 若 a=0,则为一元一次方程。

  • 若 b=0,则方程有唯一解,输出这个解;
  • 若 b=0,c=0,则方程无解,输出“无解”;
  • 若 b=0,c=0,则方程有无穷多解,输出“无穷多解”。

(2) 若 a=0,则为一元二次方程。

  • 若 Δ>0,则方程有两个不等的实根,输出这两个根;
  • 若 Δ=0,则方程有两个相等的实根,输出这两个根;
  • 若 Δ<0,则方程有两个共轭的虚根,输出这两个根。

输入格式

a,b,c

输出格式

x 或 x1​,x2​

注:所有实数均输出6位有效数字,且不输出末尾无意义的0和小数点。

 #include <stdio.h>
#include <math.h>
int main()
{
    double a,b,c,f,s;
    scanf("%lf %lf %lf",&a,&b,&c);
    if(fabs(a)<=1e-6){
        if(b!=0){
             if(c!=0)    printf("x = %.6g",-c/b);
             else    printf("x = 0");
        }else if(b==0&&c!=0){
            printf("无解");
        }else{
            printf("无穷多解");
        }
    }else{
        f=b*b-4*a*c;
        s=sqrt(f);
        if(f>1e-6){
            if(-b+s!=0&&-b-s!=0){
                printf("x1 = %.6g, x2 = %.6g",(-b+s)/2/a,(-b-s)/2/a);
            }else if(-b+s==0&&-b-s!=0){
                printf("x1 = 0, x2 = %.6g",(-b-s)/2/a);
            }else{
                printf("x1 = %.6g, x2 = 0",(-b+s)/2/a);
            }
        }else if(fabs(f)<=1e-6){
            if(b==0&&c==0){
                printf("x1 = x2 = 0");
            }else{
                printf("x1 = x2 = %.6g",-b/2/a);
            }
        }else{
            if(a>0){
                if(b!=0){
                    printf("x1 = %.6g+%.6gi, x2 = %.6g-%.6gi",-b/2/a,sqrt(-f)/(2*a),-b/(2*a),sqrt(-f)/(2*a));
                }else{
                    printf("x1 = 0+%.6gi, x2 = 0-%.6gi",sqrt(-f)/(2*a),sqrt(-f)/(2*a));
                }
            }else{
                if(b!=0){
                    printf("x1 = %.6g-%.6gi, x2 = %.6g+%.6gi",-b/2/a,sqrt(-f)/-(2*a),-b/(2*a),sqrt(-f)/-(2*a));
                }else{
                    printf("x1 = 0+%.6gi, x2 = 0-%.6gi",sqrt(-f)/-(2*a),sqrt(-f)/-(2*a));
                }
            }
        }
    }
    return 0;
}

88cac890c2b24123b9eeb22cecd32e7e.jpg

 

  • 13
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值