c语言一元二次方程求解

题设:

方程a*x^2+b*x+c=0,给定a,b,c,判断根的情况,若无穷解就输出"Infinitely root",若是虚根就输出"Imaginary root",若无解就输出"No solution"若是单根就输出"x=......",若是双根就输出"x1=......;x2=.....",所有结果保留两位小数

解题思路:分步讨论

若a,b,c都等于0,则不管x取任何值均满足方程,即无穷解

若a,b为0,而c不为0,方程可化简为c=0,即x取任何值都不满足方程,即无解

若a,c为0,而b不为0,方程可化简为bx=0,即存在单根,x=0

若b,c为0,而a不为0,方程可化简为ax^2=0,即存在双根,x1=x2=0

若a,b不为0,而c为0,方程可化简为x(a*x+b)=0,即解为x1=0,x2=-b/a

若a,c不为0,而b为0,方程可化简为ax^2+c=0即x^2=-c/a

1.若此时a,c同号,方程存在虚根

2.若此时a,c异号,方程有双实数根即+sqrt(-c/a)与-sqrt(-c/a)

若b,c不为0,而a为0,方程可化简为bx=-c,即存在单根x=-c/b

若a,b,c均不为0,设b*b-4*a*c为m

利用万能公式求解即x1=(-b+sqrt(b*b-4*a*c))/(2*a),x2=x1=(-b-sqrt(b*b-4*a*c))/(2*a)

1.若m<0,即存在虚根

2.若m=0,即存在单根,x=(-b)/(2*a)

3.若m>0,即存在双根,x1=(-b+sqrt(b*b-4*a*c))/(2*a),x2=x1=(-b-sqrt(b*b-4*a*c))/(2*a)

方法优缺点

这个方法明显讨论情况有些重复的地方,但本题思路明确,每种情况比较清晰。

这种方法讨论的方向明确,不易出错,出错的话也更容易找到错误之处

代码奉上

#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
int main()
{
    double a, b, c, root;
    const double eps = 1e-18;
    cin >> a >> b >> c;
    if (fabs(a) <= eps && fabs(b) <= eps && fabs(c) <= eps)
        cout << "Infinitely solution";
    else if (fabs(a) <= eps && fabs(b) <= eps)
        cout << "No solution";
    else if (fabs(b) <= eps && fabs(c) <= eps)
        cout
            << "x1=x2="
            << "0.00";
    else if (fabs(a) <= eps && fabs(c) <= eps)
        cout << "x="
             << "0.00";
    else if (fabs(a) <= eps)
        cout << "x=" << fixed << setprecision(2) << -c / b;
    else if (fabs(b) <= eps)
    {
        if (a*c > 0)
            cout << "No solution";
        else
            cout << "x1=" << fixed << setprecision(2) << -sqrt((-c) / a) << ";x2=" << sqrt((-c) / a);
    }
    else if (fabs(c) <= eps)
        cout << "x1="
             << "0.00;"
             << "x2=" << fixed << setprecision(2) << -b / a;
    else
    {
        root = b * b - 4 * a * c;
        if (root < 0)
            cout << "Imaginary root";
        else if (fabs(root) <= eps)
            cout << "x1=x2=" << fixed << setprecision(2) << (-b) / (2 * a);
        else if (root > 0)
            cout << "x1=" << fixed << setprecision(2) << (-b + sqrt(root)) / (2 * a) << ";x2=" << fixed << setprecision(2) << (-b - sqrt(root)) / (2 * a);
    }
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值