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

16 篇文章 0 订阅

题目:

题解:

也算是一个数论?感觉难度主要在精度的控制上?运用了分治,但是发现如果不止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);
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值