【C语言】求一元二次方程的实数根

#include<stdio.h>
#include<math.h>
double a, b, c;//二次项系数,一次项系数,常数项
double x1, x2;//实数根
double n;//n = (b * b) - (4 * a * c)判别式
main() {
    printf("请输入a:");
    scanf_s("%lf", &a);
    printf("\n");
    printf("请输入b:");
    scanf_s("%lf", &b);
    printf("\n");
    printf("请输入c:");
    scanf_s("%lf", &c);
    n = (b * b) - (4 * a * c);
    if (fabs(a) < 1e-5 && fabs(b) > 1e-5) {
        x1 = -c / b;
        x2 = x1;
        printf("\n此时该方程为一元一次方程,解x=%lf", x1);
        return 0;
    }
    if (fabs(a) < 1e-5 && fabs(b) < 1e-5) {
        if (fabs(c) < 1e-5) {
            printf("\n该式为恒等式");
            return 0;
        }
        if (fabs(c) > 1e-5) {
            printf("\n该等式不成立");
            return 0;
        }
    }
    if (n > 0) {
        x1 = (-b + sqrt(n)) / (2 * a);
        x2 = (-b - sqrt(n)) / (2 * a);
        printf("\nx1=%lf,x2=%lf", x1, x2);
    }
    else if (fabs(n) < 1e-5) {
        x1 = -b / (2 * a);
        x2 = x1;
        printf("\nx1=%lf,x2=%lf", x1, x2);
    }
    else if (n < 0) {
        printf("\n该方程无实数根");
        printf("\n\n");
    }
    return 0;
}
(这个文章我是作为我的学习报告来写的,起一个备份的作用,主要是写给自己看的,文章写的不够专业,如果有什么问题还请专业人士指正orz)

本程序只讨论实数根

之前老师布置作业的时候觉得这个程序很简单,结果真正写起来却是一堆问题

首先不能忘记math.h头文件

其次取浮点数绝对值要用fabs()

而且浮点数不能直接和0比较,float的精度误差在1e-6,double精度误差在1e-15,所以要判断一个单精度浮点数是否等于0:fabs(f) <1e-6
双精度浮点数是否等于0:fabs(d) <1e-15

当然,很多对精确度没那么高要求的情况下,例如double型,也没必要非得精确到1e-15。像我上面写的一样,如果是想让浮点型和近似0的数比较,1e-5也是可以的(除非题目对精度有明确要求),一般情况下0.00001已经很接近0了。同理,如果我把1e-5改成1e-6,1e-8,1e-14对于这个程序的结果也没什么影响。

言归正传,这个程序讨论了几种情况,包括二次项系数为0。虽然题目要求的是求一元二次方程的(实数)根,但是你输入二次项系数的时候没有把0排除在外,因此我认为需要考虑二次项系数为零(即该方程不是二次时)的情况。

我之前在优快云上逛了一圈,很少有人在这个问题里面讨论到a=0的情况。而二次项系数为0又有两种情况,第一种是一次项系数不为零,即该方程是一元一次方程,有一个解;第二种是一次项系数为零,即最后只剩下c=0的结果,以前读中学的时候这个是不用讨论的,但是现在我们可以讨论一下c是否等于0,如果c=0,结果就是恒等式;c≠0,该等式就不成立。

剩下的情况都是关于一元二次方程的常规讨论。思路还是很简单的。

输出结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值