一本通1058:求一元二次方程
Posted kyriech-francis
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一本通1058:求一元二次方程相关的知识,希望对你有一定的参考价值。
今天在刷题时发现了一个题(见一本通题库1058),有同学在群中问,题目不难,只要有初中知识就可解决。下面是题目:
看到这道题,芳源心想“好一道水题”就简单的做了一遍(下见代码):
1 #include <iostream> 2 #include <cstdio> 3 #include <cmath> 4 using namespace std; 5 int main() 6 { 7 double a,b,c; 8 double t; 9 cin>>a>>b>>c; 10 t=sqrt(b*b-4*a*c); 11 double x1=((t-b)/(2*a)),x2=((-t-b)/(2*a)); 12 if(t>=0) 13 { 14 if(t=0) 15 printf("x1=x2=%.5lf",x1); 16 else 17 {if(x1>x2) 18 printf("x1=%.5lf;x2=%.5lf",x2,x1); 19 if(x1<x2) 20 printf("x1=%.5lf;x2=%.5lf",x1,x2); 21 } 22 } 23 else cout<<"No answer!"; 24 return 0; 25 }
结果。。。。。
woc!无情!!!
我转念一想,这题可能没那么简单,于是。。。
我对它大~幅~修~改~
1 #include <cstdio> 2 #include <cmath> 3 #define eps1 1e-10 4 #define eps2 1e-6 5 using namespace std; 6 int main(){ 7 double a,b,c,x1,x2,g; 8 scanf("%lf%lf%lf",&a,&b,&c); 9 g=b*b-4*a*c; 10 if(g<0&&fabs(g)>eps1)printf("No answer!"); 11 else if(fabs(g)<eps1){ 12 x1=-b/(2*a); 13 if(fabs(x1)<eps2) 14 printf("x1=x2=%.5lf",0); 15 else 16 printf("x1=x2=%.5lf",x1); 17 } 18 else{ 19 x1=(-b+sqrt(g))/(2*a); 20 x2=(-b-sqrt(g))/(2*a); 21 if(fabs(x1)<eps2)x1=fabs(x1); 22 if(fabs(x2)<eps2)x2=fabs(x2); 23 if(x1<x2)printf("x1=%.5lf;x2=%.5lf",x1,x2); 24 else printf("x1=%.5lf;x2=%.5lf",x2,x1); 25 } 26 return 0; 27 }
成功的过了这个题
过了之后,我便写一写解析,结果发现。。。。。
我的做法这么强(qian)大(da)得嘛?!
#include <iostream> #include <cstdio> #include <cmath> #define precision_1 1e-12//定精度,用于判断浮点数大小 #define precision_2 1e-6//定精度,用于判断浮点数大小 using namespace std; int main() { double a,b,c,x1,x2,delta; cin>>a>>b>>c; delta=b*b-4*a*c;//判别式 if(delta<0&&fabs(delta)>precision_1)//当判别式小于给定的精度范围内,即delta<0时,无实根 printf("No answer! "); else if(fabs(delta)<precision_1)//当判别式小于给定的精度但>0,此时delta≈0 { x1=-b/(2*a); if(fabs(x1)<precision_2) //超出所给的最小范围,此时,视为delta=0,直接输出0 printf("x1=x2=%.5lf ",0); else//未超出所给范围时,结果仍在小数点后5位有效数字以内,输出结果 printf("x1=x2=%.5lf ",x1); } else//delta>0时 { x1=(-b+sqrt(delta))/(2*a); x2=(-b-sqrt(delta))/(2*a); if(fabs(x1)<precision_2) x1=fabs(x1);//小于所给的最高精度,编译系统视为-0,求绝对值 if(fabs(x2)<precision_2) x2=fabs(x2);//小于所给的最高精度,编译系统视为-0,求绝对值 if(x1<x2)//x1、x2中小的数在前输出 printf("x1=%.5lf;x2=%.5lf",x1,x2); else printf("x1=%.5lf;x2=%.5lf",x2,x1); } return 0;}
不说了,看着都自闭......
一定要多预习,尤其是像我一样的蒟蒻。
到这就完了
别往下看了
真没了。。。
以上是关于一本通1058:求一元二次方程的主要内容,如果未能解决你的问题,请参考以下文章