【luogu1024】一元三次方程求解(精度控制)

来源:互联网 发布:瑟尔效应 知乎 编辑:程序博客网 时间:2024/05/17 01:35

题目:

题解:

也算是一个数论?感觉难度主要在精度的控制上?运用了分治,但是发现如果不止3个结果判重超级麻烦。果然不是正解?

正解二分,至于把我愚蠢的代码粘上只是想复习复习精度控制?

代码:

分治

#include <cstdio>using namespace std;double A,B,C,D,ans[5];const double eps=1e-6;int cnt;int dcmp(double x){if (x<=eps && x>=-eps) return 0;if (x>eps) return 1;return -1;}double f(double x){return A*x*x*x+B*x*x+C*x+D;}void div(double l,double r){if (cnt==3) return;if (r-l<=1 && f(l)*f(r)>0) return; if (dcmp(l-r)==0){if (cnt==1 && l==ans[1]) return;if (cnt==2 && (l==ans[1] || l==ans[2])) return;ans[++cnt]=l;return;}double mid=(double)(l+r)/2;if (l<mid) div(l,mid);if (mid<r) div(mid,r);}int main(){scanf("%lf%lf%lf%lf",&A,&B,&C,&D);div(-100.00,100.00);for (int i=1;i<=3;i++)  printf("%.2lf ",ans[i]);}

正解:

#include <cstdio>using namespace std;double A,B,C,D;const double eps=1e-6;int cnt;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 (int i=-100;i<=100;i++){if (cnt==3) return 0;double x1=i,x2=i+1;if (f(x1)==0){cnt++; printf("%.2lf ",x1);continue;}if (f(x1)*f(x2)>=0) continue;while (x2-x1>=eps){double xx=(double)(x1+x2)/2;if (f(xx)*f(x1)<0) x2=xx;else if (f(xx)*f(x2)<0) x1=xx;}cnt++; printf("%.2lf ",x1);}}