#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,该等式就不成立。
剩下的情况都是关于一元二次方程的常规讨论。思路还是很简单的。
输出结果: