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

文章讲述了如何在给定一个三次多项式函数的情况下,利用分段扫描和二分法求解零点,特别强调了当题目中存在多根且距离大于1时的处理方法。代码展示了如何针对区间判断并执行浮点数二分搜索。
摘要由CSDN通过智能技术生成

 二分法最关键的弱点就是对于多根的问题束手无策,在这个题中为了使得二分可用,题目设计了两根的距离大于1,这使得分段扫描成为可能,这也就是分治的思维

  1. 首先先从-100到100,以间隔为1进行扫描,找到可能的区间
  2. 然后对于区间进行处理,首先要考虑到区间头和区间尾可能为0,为了使得前后不重复处理,我们可以将区间分成[i,i+1)的形式,先判断i时候是否为0,然后再判断i和i+1的函数值是否异号
  3. 如果异号且i+1的时候不为0则进行浮点数二分处理

代码如下:

#include<iostream>
#include<cmath>
using namespace std;
float a, b, c, d;
float ans[3];
int k = 0;
float fx(float x)
{
	return a * pow(x, 3) + b * pow(x, 2) + c * x + d;
}
int main()
{
	scanf("%f %f %f %f", &a, &b, &c, &d);
	for (int i = -100; i < 100 && k < 3; i++)
	{
		float f1 = fx(i), f2 = fx(i + 1);
		if (fabs(f1) < 1e-8)
		{
			ans[k++] = i;
			continue;
		}
		else if (f1 * f2 < 0 && fabs(f2)>1e-8)
		{
			float left = i, right = i + 1;
			while (fabs(left - right) >= 0.001)
			{
				float mid = (left + right) / 2;
				if (fabs(fx(mid)) < 1e-8)
				{
					ans[k++] = mid;
					break;
				}
				else if (fx(mid) * fx(left) < 0)
					right = mid;
				else left = mid;
			}
			ans[k++] = left;
		}
	}
	printf("%.2f %.2f %.2f", ans[0], ans[1], ans[2]);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值