本题目要求一元二次方程ax 2 +bx+c=0的根,结果保留2位小数。(注意:0.00会在gcc下被输出为-0.00,需要做特殊处理,输出正确的0.00。)
时间: 2024-10-08 12:26:21 浏览: 109
一元二次方程求解的一般公式是通过韦达定理,即对于方程 \( ax^2 + bx + c = 0 \),如果a不等于0,那么它的两个根可以通过以下公式计算:
\[ x_1 = \frac{-b + \sqrt{b^2 - 4ac}}{2a} \]
\[ x_2 = \frac{-b - \sqrt{b^2 - 4ac}}{2a} \]
这两个根可能是实数也可能是一对复数,取决于判别式 \( b^2 - 4ac \) 的值。在实际编程中,你需要处理可能的特殊情况,比如当判别式小于0时,表示无实根,这时通常返回复数形式;当判别式等于0时,有两个相同的实根。
为了避免输出错误,如将0.00误认为-0.00,你可以对结果进行检查并手动调整。例如,在C++中,可以这么处理:
```cpp
#include <cmath>
#include <string>
std::pair<double, double> quadratic(double a, double b, double c) {
double discriminant = b * b - 4 * a * c;
if (discriminant > 0 && std::abs(discriminant - std::pow(10, -2)) < std::pow(10, -2)) { // 判别式非常接近0
discriminant = 0;
}
double root1 = (-b + std::sqrt(std::abs(discriminant))) / (2 * a);
double root2 = (-b - std::sqrt(std::abs(discriminant))) / (2 * a);
if (root1 == root2) {
return std::make_pair(root1, root1); // 相同的实根
} else if (std::abs(root1) < std::pow(10, -2) && std::abs(root2) < std::pow(10, -2)) {
return std::make_pair(0.00, 0.00); // 都是零,特别处理
} else {
return std::make_pair(root1 * 100, root2 * 100); // 保留两位小数并四舍五入
}
}
// 使用示例
auto roots = quadratic(1, -5, 6);
std::cout << "Roots are: " << roots.first << " and " << roots.second << std::endl;
```
阅读全文