好吧,这道题思路还是比较简单的。整个程序大体上很快就打出来了,然后修改了解为整数的情况。
但是交上去一直是50分,最后我很无耻的看了题解,然后抄了一个玄学if回来,瞬间AC,不知道为什么。。。
这句就是玄学:
1 if(f(i)*f(i+1)<0)
好吧,下面来看AC代码(本题还可以用2*暴力来做,也很naive)
1 #include <cstdio> 2 #include <iostream> 3 using namespace std; 4 double a,b,c,d; 5 double f(double x) 6 { 7 return a*x*x*x+b*x*x+c*x+d; 8 } 9 void tw(double l,double r) 10 { 11 if(r-l<=0.005) 12 { 13 printf("%.2f ",l); 14 return; 15 } 16 double mid=(l+r)/2.0; 17 double ll=f(l); 18 double rr=f(r); 19 if(ll==0) 20 { 21 printf("%.2f ",l); 22 return; 23 } 24 if(rr==0) 25 { 26 printf("%.2f ",r); 27 return ; 28 } 29 if(ll*rr>0) return; 30 double m=f(mid); 31 if(m==0) 32 { 33 printf("%.2f ",mid); 34 return; 35 } 36 if(m*ll<0) tw(l,mid); 37 else tw(mid,r); 38 return; 39 } 40 41 int main() 42 { 43 cin>>a>>b>>c>>d; 44 for(double i=-101.0;i<=100.1;i++) 45 { 46 47 if(f(i)==0.00) 48 { 49 printf("%.2f ",i); 50 } 51 if(f(i)*f(i+1)<0) tw(i,i+1); 52 } 53 return 0; 54 }
可以发现二分很冗杂...可以改进。