C语言 计算一元二次方程

 1.注意事项
这里是问题所在:

```c
x1 =(- b + sqrt(ant)) / 2 * a;
x2 =(- b - sqrt(ant)) / 2 * a;
```

由于`/`和`*`具有相同的优先级,并且从左到右进行运算,所以`2 * a`实际上是与`sqrt(ant)`相乘,而不是与整个除法结果相乘。因此,你会得到一个非常小的数(如果`a`不是非常大)除以`2 * a`,结果接近0。

为了修复这个问题,你需要用括号将除法运算包围起来,确保`2 * a`是在分母中:

```c
x1 = (-b + sqrt(ant)) / (2 * a);
x2 = (-b - sqrt(ant)) / (2 * a);
```

此外,当`ant`等于0时,你试图将`x1`的值赋给`x2`,但是实际上你再次将`-b / 2 * a`的结果赋给了`x1`,而没有将`x1`的值赋给`x2`。你应该直接这样做:

```c
else if (ant == 0)
{
    x1 = -b / (2 * a);
    x2 = x1; // 或者简单地不设置x2,因为x1和x2现在是相同的
    printf("方程有两个相同的根\nx1=%d x2=%d", x1, x2);
}
```

请注意,如果`a`为0,则方程不是一个二次方程,而且除以0会导致运行时错误。在实际的程序中,你应该检查`a`是否不为0。

我还添加了`#include<math.h>`来包含`sqrt`函数的定义,并将`ant`、`x1`和`x2`的类型更改为`double`,因为方程的解可能是浮点数。此外,我还使用了`%.2f`来格式化输出浮点数,以便结果更易于阅读。
 

2.正确全部代码:

#include<stdio.h>
#include<math.h>
int main(){
    int a, b, c;
    double ant = 0.0;
    
    double x1 = 0.0;
    double x2 = 0.0;
    printf("请输入一元二次方程的三个系数:");
    scanf("%d%d%d", &a, &b, &c);
    if (a == 0) {
        printf("这不是一个方程");
        return 1;
    }
    ant = b * b - 4 * a * c;
    if (ant > 0) {
        x1 =(- b + sqrt(ant)) / (2 * a);
        x2 =(- b - sqrt(ant)) /( 2 * a);
        printf("方程有两个不同的根\nx1=%.2f x2=%.2f",x1,x2);
    }
    else if (ant == 0)
    {
        x1 = -b / (2 * a);
        x1 = x2;
        printf("方程有两个相同的根\nx1=%.2f x2=%.2f", x1, x2);
    }
    else {
        printf("方程无解");
    }
    return 0;
}
 

在C语言中,可以使用公式法或者数值计算库如`math.h`中的函数来求解一元二次方程一元二次方程通常形式为 `ax^2 + bx + c = 0`,其中 `a`、`b` 和 `c` 是已知常数,`x` 是未知数。以下是使用公式法的基本步骤: 1. 首先检查系数 `a` 是否为0,如果 `a=0`,那么这不是一个二次方程,而是线性方程。 2. 计算判别式 `D = b^2 - 4ac`。判别式的正负决定了方程根的情况: - 如果 `D > 0`,有两个实根:`x1 = (-b + sqrt(D)) / (2a)` 和 `x2 = (-b - sqrt(D)) / (2a)`。 - 如果 `D = 0`,有一个重根:`x = -b / (2a)`。 - 如果 `D < 0`,无实根,但可以通过复数解找到两个共轭复数根。 下面是一个简单的C程序示例,用于求解一元二次方程: ```c #include <stdio.h> #include <math.h> void solve_quadratic(double a, double b, double c) { double discriminant = b * b - 4 * a * c; if (a == 0) { printf("这不是一个二次方程,处理线性方程...\n"); return; } if (discriminant > 0) { double x1 = (-b + sqrt(discriminant)) / (2 * a); double x2 = (-b - sqrt(discriminant)) / (2 * a); printf("方程有两实根: x1 = %.2f, x2 = %.2f\n", x1, x2); } else if (discriminant == 0) { double root = -b / (2 * a); printf("方程有一重根: x = %.2f\n", root); } else { double real_part = -b / (2 * a); double imaginary_part = sqrt(-discriminant) / (2 * a); printf("方程无实根,但有两个复数根: x1 = %.2f + %.2fi, x2 = %.2f - %.2fi\n", real_part, imaginary_part, real_part, imaginary_part); } } int main() { double a, b, c; printf("请输入二次方程的系数 a, b, c:\n"); scanf("%lf %lf %lf", &a, &b, &c); solve_quadratic(a, b, c); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值