解法一:
#include<iostream> #include<string> #include<cstdio> #include<string.h> #include<cmath> using namespace std; double a,b,c,d; //方法一:直接法 int main() { cin>>a>>b>>c>>d; for(double x=-100;x<=100;x+=0.01) { if(abs(a*x*x*x+b*x*x+c*x+d)<=0.0001) { printf("%.2lf ",x); } } return 0; }
解法二:
#include<iostream> #include<cstdio> #include<cmath> using namespace std; double a,b,c,d; //方法二:直接法 double f(double x) { return a*x*x*x+b*x*x+c*x+d; } int main() { cin>>a>>b>>c>>d; for(double x=-100;x<=100;x+=0.01) { //x---x+0.01 if(f(x)*f(x+0.005)<0)//x--x+0.005 { printf("%.2lf ",x); } else if(f(x+0.01)*f(x+0.005)<0)//x+0.005---x+0.01 { printf("%.2lf ",x+0.01); } } return 0; }
解法三:二分法
#include<iostream> #include<cstdio> #include<cmath> using namespace std; double a,b,c,d; //方法二:直接法 double f(double x) { return a*x*x*x+b*x*x+c*x+d; } void solve(double l,double r){ double mid,ans=0; while(r-l>=0.001) { mid=(l+r)/2; if(f(mid)==0) ans=mid; if(f(l)==0) ans=l; if(f(r)==0) ans=r; if(f(mid)==0) break; else if(f(mid)*f(r)>0) r=mid; else if(f(mid)*f(r)<0) l=mid; } printf("%.2f ", mid); } int main() { cin>>a>>b>>c>>d; for(double x=-100;x<=100;x++) { if(f(x)==0) printf("%.2lf ",x); else if(f(x)*f(x+1)<0) solve(x,x+1); } return 0; }
#include<iostream> #include<cstdio> #include<cmath> using namespace std; double a,b,c,d; //方法二:直接法 double f(double x) { return a*x*x*x+b*x*x+c*x+d; } void solve(double l,double r){ double mid,ans=0; while(r-l>=0.001) { mid=(l+r)/2; if(f(mid)==0) ans=mid; if(f(l)==0) ans=l; if(f(r)==0) ans=r; if(f(mid)==0) break; else if(f(mid)*f(r)>0) r=mid; else if(f(mid)*f(r)<0) l=mid; } printf("%.2f ", mid); } int main() { cin>>a>>b>>c>>d; for(double x=-100;x<=100;x++) { if(f(x)==0) printf("%.2lf ",x); else if(f(x)*f(x+1)<0) solve(x,x+1); } return 0; }