首页 > 代码库 > codevs 1038 一元三次方程求解 NOIP2001提高组

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 }

 

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