这道题如果要解出来的话,除了要想到二分,更要想到枚举区间段为1的各部分,然后再注意注意细节就差不多了。
#include<bits/stdc++.h> using namespace std; double a,b,c,d; int ans=0; inline double f(double x)//定义好求值的函数 { return a*x*x*x+b*x*x+c*x+d; } int main() { scanf("%lf %lf %lf %lf",&a,&b,&c,&d); for(double i=-100;i<=99;i++) { if(ans>=3) break;//ans用于优化,因为题目中说了只有3个,所以当我们已经找到三个的时候可以直接退出 if(f(i)*f(i+1)<=0)//注意这里是<=因为有可能两端端点是零点 { if(f(i)==0) printf("%.2f ",i),ans++; else if(f(i+1)==0) printf("%.2f ",i+1),i++,ans++; else{ double l=i; double r=i+1; double mid=(l+r)/2; while(r-l>0.01)//精度为2位小数,说明这个区域范围要小于0.01 { if(f(l)*f(mid)<=0) { r=mid; } else{ l=mid; } mid=(l+r)/2; } printf("%.2f ",mid); ans++; } } } }