欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【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);
	}
}