1.求ax^2+bx+c=0方程的根。a,b,c由键盘输入,设b^2-4ac>0.
设计思想:
此想法是考虑a!=0且有两个不等的方程跟(因为题目中告诉了 设b^2-4ac>0 )。
具体思想如下图片:
代码:
#include <stdio.h>
#include <math.h>
int main()
{
double a,b,c,disc,x1,x2,p,q;
scanf("%lf%lf%lf",&a,&b,&c);
disc=b*b-4*a*c;
p=-b/(2.0*a);
q=sqrt(disc)/(2.0*a);
x1=p+q;x2=p-q;
printf("x1=%7.2f\nx2=%7.2f\n",x1,x2);
return 0;
}
结果展示:
拓展:
1.全方位考虑-在a!=0的情况下考虑,有两个不相等的根,有两个相等的根,有共轭根。
则此时出现了判断。
代码:
#include<stdio.h>
#include<math.h>
int main ()
{
double a,b,c,d,p;
printf("请输入a,b,c 的值:");
scanf("%lf%lf%lf",&a,&b,&c);
if(a==0)
printf("不是二次方程");
else
{
d=b*b-4*a*c;
if(d==0)
{
printf("有两个相等的根\nx=%7.2lf\n",-b/(2*a));
}
if (d>0)
{
printf("有两个不相等的根\nX1=%7.2lf\nX2=%7.2lf\n",(-b+sqrt(d))/(2*a),(-b-sqrt(d))/(2*a));
}
if(d<0)
{
p=sqrt(-d/(2*a));
printf("有两个共轭复根\nX1=%7.2lfi-%7.2lf\nX2=%7.2lfi-%7.2lf\n",p,b/2,-p,b/2);
}
} return 0;
}
结果展示:
1.两个不相等的根
2.有两个相等的根
3.有共轭复根
3.不是二次方程
2.全方位考虑2-在a=0和a!=0的情况下(有点复杂)
思路:
化方程为一般式:
分类讨论根的情况(a、b、c)
代码:
#include <stdio.h>
#include <math.h>
int main(){
float a,b,c;
printf("Pleaser enter a、b、c:");
scanf("%f %f %f",&a,&b,&c);
float x1,x2,x,real,image;
if(a==0){
if(b==0){
if(c==0){//a=0,b=0,c=0;
printf("方程的解为任意常数;\n");
}
else{//a=0,b=0,c!=0;
printf("方程无解;\n");
}
}
else{//a=0,b!=0;
x=-(c/b);
printf("原方程的的解为:x=%8.4f\n",x);
}
}
else{//a!=0
float disc=b*b-4*a*c;
if(fabs(disc)<1e-6){//a!=0;b^2-4ac=0;
x=-(b/(2*a));
printf("原方程的的解为:x=%8.4f\n",x);
}else if(disc>1e-6){//a!=0;b^2-4ac>0;
x1=(-b+sqrt(disc))/(2*a);
x2=(-b-sqrt(disc))/(2*a);
printf("原方程的的解为:x1=%8.4f ; x2=%8.4f \n",x1,x2);
}else{//a!=0;b^2-4ac>0;
real=-b/(2*a); //实部
image=sqrt(-disc)/(2*a); //虚部
printf("原方程的的解为:x1=%8.4f+%8.4fi ; x2=%8.4f+%8.4fi \n",real,image,real,image);
}
}
}
结果展示:
程序说明:
由于disc(即b2−4ac b^2-4acb
2
−4ac)是实数,而实数在计算和存储是很会有一些微小的误差,因此不能直接进行如下判断:“if(disc==0)”
解决办法:判别disc的绝对值(即:fabs(disc))是否小于一个很小的值(例如:10−6 10^-610
−
6,计算机语言为 1e-6 或 1E-6),如果小于此数,就认为disc等于0;
参考文章:
https://blog.csdn.net/neusoft06/article/details/78771492
https://blog.csdn.net/Yangjiankang_0929/article/details/44627349