[ACM]【二分查找】洛谷P1024 一元三次方程求解

一元三次方程求解

思路:

因为这道题放在二分题单里 暴力的话就用二分吧(貌似还有巨佬用公式做,待会康康)。但是想来想去不知道怎么二分233(可能这就是菜吧)。直到说看到根与根之差的绝对值>=1,噢原来是一个一个区间来搜索啊…。
其实关键的地方大概就在于控制精度区间的边界了。
代码试图特判左边界,直接continue,二分区间内部,当然这样的话你会发现100被漏掉了,那就特判个100。
精度关键在于二分,因为left和right最终距离会小于0.01,那么就不用考虑是upper_bound还是lower_bound。直接ans每次都切换成为left或right。

代码:

#include<bits/stdc++.h>
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(){
	int cnt=0;
	double ans;
	double l,r,m,tmp1,tmp2;
	scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
	for(int i=-100;i<100;i++){
		l=i,r=i+1;
		tmp1=f(l),tmp2=f(r);
		if(!tmp1){
			printf("%.2lf ",l);
			cnt++;
			continue;
		}
		if(tmp1*tmp2<0){
			while(r>=l){
            	m=(l+r)/2;
				if(f(m)*f(l)<=0)r=m-0.0001,ans=m;
				else l=m+0.0001,ans=m;
			}
			printf("%.2lf ",ans);
			cnt++;
		}
		if(cnt==3)break;
	}
	l=100;
	if(cnt==2)printf("%.2lf ",l);
	return 0;
}
发布了9 篇原创文章 · 获赞 0 · 访问量 99

猜你喜欢

转载自blog.csdn.net/weixin_45497996/article/details/105364997