题设:
方程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;
}