用c语言求一元二次方程ax2+bx+c=0的根,结果保留2位小数。(注意:0.00会在gcc下被输出为-0.00,需要做特殊处理,输出正确的0.00。)
时间: 2024-11-13 19:27:50 AIGC 浏览: 167
在C语言中,求解一元二次方程 ax^2 + bx + c = 0 的根通常涉及到计算判别式(b² - 4ac),然后根据判别式的正负分别采用公式法(两个实根)、复数形式(一个实根和一个虚根)来计算。以下是基本步骤:
1. 首先检查系数a是否为0,因为若a=0,该方程就不是二次方程了。
2. 计算判别式 Δ = b² - 4ac。
3. 根据判别式的值,确定根的情况:
- 4ac)] / (2a) 计算。
- 如果Δ = 0,有一个重根,x = -b / (2a),只需取一次除法。
- 如果Δ < 0,表示有两对共轭复根,可以使用复数数学库(如C++中的cmath)来计算,但这超出了标准C的范围,这里仅提供标准C的解决方案。
由于题目要求结果保留两位小数,我们可以使用`printf`函数,并在输出前用`fabs()`函数确保结果的正负,并用`snprintf`来控制精度。
下面是一个简单的C代码示例(假设已经存在double类型的a、b和c):
```c
#include <stdio.h>
#include <math.h>
// 求解一元二次方程的根并保留两位小数
void quadratic(double a, double b, double c) {
if (a == 0) {
printf("这不是一个二次方程(a不能为0)\n");
return;
}
double discriminant = b * b - 4 * a * c;
if (discriminant >= 0) {
double root1, root2;
// 实数根
if (discriminant > 0) {
root1 = (-b + sqrt(discriminant)) / (2 * a);
root2 = (-b - sqrt(discriminant)) / (2 * a);
// 使用snprintf保证两位小数并处理-0.00的情况
char buffer[10];
snprintf(buffer, sizeof(buffer), "%.*f", 2, root1);
if (buffer[strlen(buffer)-1] == '.') {
buffer[strlen(buffer)-2] = '\0';
}
printf("%s\n", buffer);
snprintf(buffer, sizeof(buffer), "%.*f", 2, root2);
if (buffer[strlen(buffer)-2] == '0' && buffer[strlen(buffer)-1] == '.') {
buffer[strlen(buffer)-2] = '\0';
}
printf("%s\n", buffer);
} else { // 重根
root1 = -b / (2 * a);
snprintf(buffer, sizeof(buffer), "%.*f", 2, root1);
if (buffer[strlen(buffer)-2] == '0' && buffer[strlen(buffer)-1] == '.') {
buffer[strlen(buffer)-2] = '\0';
}
printf("%s\n", buffer);
}
} else {
printf("方程无实数解,有共轭复数根。\n");
}
}
int main() {
// 示例:求解x^2 + 5x + 6 = 0
double a = 1, b = 5, c = 6;
quadratic(a, b, c);
return 0;
}
```
阅读全文
相关推荐




















