关于一元二次方程问题(C++)

一元二次方程求根
时间限制:1Sec内存限制:128MB

题目描述

根据给定的a,b,c的值求解方程ax^2+bx+c=0的根。

输入

输入有n+1行,第一行是一个int值,表示测试数据的组数。下面有n行,每行有三个实数,分别为a,b,c的值,用空格隔开。

输出

输出有n行,分别对应输入的每组a,b,c的值输出的结果,每一行具体格式为:
a) 如果方程有两个实根,按从小到大的顺序输出这两个实根,精确到小数点后3位。
b) 如果方程有一个实根,输出这一个实根,精确到小数点后3位。
c) 如果方程没有实根,输出"No real."。
d) 如果方程没有根,输出"No answer."。
e) 如果方程有无穷多根,输出"Inf."。

样例输入

5
1 3 2
1 2 1
1 2 8
0 0 4
0 0 0

样例输出

-2.000 -1.000
-1.000
No real.
No answer.
Inf.

我的初步答案

#include<iostream>
#include<cmath>
#include<iomanip>
using namespace std;
int main()
{
    int d;
    cin >> d;
    for (int i = 0; i < d; i++)
    {
        double a, b, c, x, y,l,x1,x2,x3,x4;
        cin >> a >> b >> c;
        if ((a != 0 && b != 0)||a!=0)
        {
            l = b * b - 4 * a*c;
            x1 = (-b - sqrt(b*b - 4 * a*c)) / 2 * a;
            x2 = (-b + sqrt(b*b - 4 * a*c)) / 2 * a;
            x3 = -b / (2 * a);
            if (l > 0)
                cout << fixed << setprecision(3) << x1 << " " << x2 << endl;
            else if (l == 0)
                cout << fixed << setprecision(3) << x3 << endl;
            else if(l<0)
                cout << "No real." << endl;
        }
        if (a == 0 && b == 0 && c == 0)
            cout << "Inf." << endl;
        else if (( a == 0 && b == 0)||(a==0))
           cout << "No answer." << endl; 
    }
    return 0;
}

输入输出都对上了,但结果还是错的

else if (( a == 0 && b == 0)||(a==0))这里逻辑是错的,a==0,b不等于0的时候,是有解的。
代码修改如下:

#include<iostream>
#include<cmath>
#include<iomanip>
using namespace std;
int main()
{
    int d;
    cin >> d;
    for (int i = 0; i < d; i++)
    {
        double a, b, c, x, y,l,x1,x2,x3,x4;
        cin >> a >> b >> c;
        if (a==0 &&b==0)
        {
            if(c==0)
                cout<<"Inf."<<endl;
            else
                cout <<"No answer."<<endl;
        }else 
        {
            if (a==0)
                cout << fixed << setprecision(3) << -c/b << endl;
            else
            {
                l = b*b - 4*a*c;
                if(l<0)
                    cout << "No real." << endl;
                else if(l==0)
                    cout << fixed << setprecision(3) <<  -b / (2 * a) << endl;
                else
                {
                    x1 = (-b - sqrt(b*b - 4 * a*c)) / 2 * a;
                    x2 = (-b + sqrt(b*b - 4 * a*c)) / 2 * a;
                    cout << fixed << setprecision(3) << x1 << " " << x2 << endl;
                }
            }
        }
    }
    return 0;
}



#include<iostream>
#include<cmath>
#include<iomanip>
#define N 10
using namespace std;
int main()
{
    int d;
    cin >> d;
    double a[N], b[N], c[N], l, x1, x2, x3;
    for (int i = 0; i < d; i++)
    {
        
        cin >> a[i] >> b[i] >> c[i];
        
        

    }
    for (int i = 0; i < d; i++)
    {
        if (a[i] == 0 && b[i] == 0 && c[i] == 0)
            cout << "Inf." << endl;
        else if (a[i] == 0 && b[i] == 0)
            cout << "No answer." << endl;
        else
        {
            l = b[i] * b[i] - 4 * a[i] * c[i];
            x1 = (-b[i] - sqrt(b[i] * b[i] - 4 * a[i] * c[i])) / 2 * a[i];
            x2 = (-b[i] + sqrt(b[i] * b[i] - 4 * a[i] * c[i])) / 2 * a[i];
            x3 = -b[i] / (2 * a[i]);
            if (l > 0)
                cout << fixed << setprecision(3) << x1 << " " << x2 << endl;
            else if (l == 0)
                cout << fixed << setprecision(3) << x3 << endl;
            else
                cout << "No real." << endl;
        }
    }
    return 0;
}


img

img