一本通1058:求一元二次方程

Posted kyriech-francis

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一本通1058:求一元二次方程相关的知识,希望对你有一定的参考价值。

今天在刷题时发现了一个题(见一本通题库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:求一元二次方程的主要内容,如果未能解决你的问题,请参考以下文章

长春市哪里有卖这本信息学奥赛一本通c++的书店?

信息学奥赛一本通要多少钱

信息奥赛一本通 1060:均值

信息学奥赛一本通为啥不通过

樱花(信息学奥赛一本通 1624)

loj10164. 「一本通 5.3 例 2」数字游戏