codevs 1038 一元三次方程求解 NOIP2001提高组

题目链接:http://codevs.cn/problem/1038/

题解:

  嗯,exm?才知道二分隶属搜索专题……

  对-100到100枚举,按照题目中的提示,当当fi*fi+1<0时,二分深搜,直到精度达到小数点后4位为止(保守起见),当fi*fi+1=0时,判定i是否为解,否则跳过(如果i和i+1都为解,下一次循环时还会再判断i+1)
 1 #include<cstdio>
 2 #include<cmath>
 3 double a,b,c,d;
 4 double f(double x)
 5 {
 6     return a*x*x*x+b*x*x+c*x+d;
 7 }
 8 void search(double l,double r)
 9 {
10     if(r-l<0.001)
11     {
12         printf("%.2lf ",l);
13         return;
14     }
15     if(f(l)*f(r)<0)
16     {
17         double mid=(l+r)/2;
18         if(f(l)*f(mid)==0)
19         {
20             printf("%.2lf ",l);
21             return;
22         }
23         else if(f(l)*f(mid)<0)
24         {
25             search(l,mid);
26             }
27         else if(f(mid)*f(r)<0)
28         {
29             search(mid,r);
30         }
31     }
32 }
33 int main()
34 {
35     scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
36     for(int i=-100;i<=100;i++)
37     {
38         if(f(i)*f(i+1)<0)
39         {
40             search(i,i+1);
41         }
42         else if(f(i)*f(i+1)==0)
43         {
44             if(f(i)==0)printf("%.2lf ",(double)i);
45         }
46     }
47     return 0;
48 }

 

posted @ 2016-10-16 00:29  xqmmcqs  阅读(516)  评论(0编辑  收藏  举报