【luogu1024】一元三次方程求解(精度控制)
程序员文章站
2022-05-09 10:04:07
...
题目:
题解:
也算是一个数论?感觉难度主要在精度的控制上?运用了分治,但是发现如果不止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);
}
}
上一篇: Photoshop设计大气的好莱坞电影海报之皇家赌场
下一篇: 【POJ 3714】Raid