当前位置: 首页 > wzjs >正文

定制网站建设服务商优书网首页

定制网站建设服务商,优书网首页,网站后台做图片尺寸是多大,郑州优化疫情2025 - 02 - 13 - 第 52 篇 作者(Author): 郑龙浩 / 仟濹(CSND) 【二分搜索】 P1024 一元三次方程求解 题目描述 有形如: a x 3 b x 2 c x d 0 a x^3 b x^2 c x d 0 ax3bx2cxd0 这样的一个一元三次方程。给出该方程中各项的系数( a , b , c ,…

2025 - 02 - 13 - 第 52 篇
作者(Author): 郑龙浩 / 仟濹(CSND)
【二分搜索】

P1024 一元三次方程求解

题目描述

有形如: a x 3 + b x 2 + c x + d = 0 a x^3 + b x^2 + c x + d = 0 ax3+bx2+cx+d=0 这样的一个一元三次方程。给出该方程中各项的系数( a , b , c , d a,b,c,d a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在 − 100 -100 100 100 100 100 之间),且根与根之差的绝对值 ≥ 1 \ge 1 1。要求由小到大依次在同一行输出这三个实根(根与根之间留有空格),并精确到小数点后 2 2 2 位。

提示:记方程 f ( x ) = 0 f(x) = 0 f(x)=0,若存在 2 2 2 个数 x 1 x_1 x1 x 2 x_2 x2,且 x 1 < x 2 x_1 < x_2 x1<x2 f ( x 1 ) × f ( x 2 ) < 0 f(x_1) \times f(x_2) < 0 f(x1)×f(x2)<0,则在 ( x 1 , x 2 ) (x_1, x_2) (x1,x2) 之间一定有一个根。

输入格式

一行, 4 4 4 个实数 a , b , c , d a, b, c, d a,b,c,d

输出格式

一行, 3 3 3 个实根,从小到大输出,并精确到小数点后 2 2 2 位。

输入输出样例 #1

输入 #1

1 -5 -4 20

输出 #1

-2.00 2.00 5.00

说明/提示

【题目来源】

NOIP 2001 提高组第一题

思路

首先要分析题目:
判断是否为 “根” 只有两种方法:

**前提:x 是以 1 个单位长度依次递增,而不是2 3 4什么的,就是一个单位长度 **

  • f( x ) == 0x 百分百为 “根”

  • left < right 且 f( left ) * f( right ) < 0,在 left 与 right 之间会有一个 x,这个 x 就是根

    为什么要确定 leftright 呢??

    因为 left 与 right 是两个整数,而这两个整数的距离实际上是1,比如 1与2,2与3,然后再确定具体的值1.23, 2.45(随便举例)等

    并且 f( left ) f( right ),一个为 正 一个为负数,中间可定有一个 f( x ) 为 0

    所以确定下来 left, right之后的任务就是:将 x 求出来,如何求???

    使用二分算法

    • 范围为 left ~ right

    • 不断 left ~ right / 2 ,直到满足 left < right right - left <= 0.001

      right - left <= 0.001 意思就是: 确定下来这两个数之间的差为三个小数,这样就能将 将结果变为 left 了

      Eg: 最后一层循环:

      left = 1.234
      right = 1.235
      ans = 1.234;
      // 四舍五入: 1.23
      

      当二分法的区间长度缩小到0.001时,取中间值作为近似解,四舍五入到两位小数时误差不会超过0.005。例如,假设真实解在某个区间[left, right],其中right - left = 0.001。此时中间值mid的误差最大是0.0005,这样在保留两位小数时,结果会是正确的。例如,若真实解是1.2345,而mid是1.234或1.235,四舍五入到两位小数后都是1.23或1.24,但需要确保在两位小数时的正确性。或者,可能作者认为当区间足够小时,可以直接输出区间端点中的某个值,作为近似解。

代码流程

  1. 输入系数a, b, c, d
  2. 遍历i-100到100,每次检查区间[i, i+1]是否存在根。
  3. 对于每个i,先检查f(i)是否为0,如果是就直接输出。
  4. 如果f(i)*f(i+1) < 0,说明该区间有一个根,调用二分法查找。
  5. 二分法在区间内不断缩小区间,直到区间长度小于0.001,然后返回左端点作为近似解。
  6. 所有找到的根按顺序输出。

代码

// 洛谷P1024一元三次方程求解
// 2025-02-12
// 郑龙浩 / 仟濹
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
double a, b, c, d;
// 查找 left 与 right 之间的 x
double binary_search_self( double left, double right );
// 计算带入方程结果
double fun( double x );
int main( void ){cin >> a >> b >> c >> d;for( int i = -100; i <= 99; i ++ ){// if fun( i ) 的值 == 0.,就代表 i 就是根// 因为 i 是从小到大判断的,无需sortif ( fun( i ) == 0 ){// 记住: i 要转换成 double 类型,不然 直接 直接用 %f 打印 int ,结果是0// 因为我找了半天错,没找出来,就是这里写错了,要强制类型转换(小细节)printf( "%.2f ", (double)i );}if ( fun( i ) * fun( i + 1 ) < 0 ){ // 确定下来这个根在 i 与 i + 1 间double ans = binary_search_self( i, i + 1 );printf( "%.2f ", ans );}}return 0;
}
// 查找 left 与 right 之间的 x
double binary_search_self( double left, double right ){double middle;while( right - left > 0.001 ){middle = ( left + right ) / 2.0;if( fun( left ) * fun( middle ) < 0 ) right = middle;//说明根在left~mid中 else left = middle;//说明根在mid~right中 }return ( left + right ) / 2;// 精度更高,可以不left - AI 给我提的意见// 第一次写的做法// return left; // 输入left 千万不要right 比如: 1.234,1.235,输出第二个四舍五入的1.24
}
// 计算带入方程结果
double fun( double x ){double ans = a * pow(x, 3) + b * pow(x, 2) + c * x + d;return ans;
}
http://www.dtcms.com/wzjs/219263.html

相关文章:

  • dede重工蓝色企业免费网站模板广告策划
  • 重庆电子网站建设旅游营销推广方案
  • 手机制作图片的软件免费seo中文含义是什么
  • 高州做网站太原做网站哪家好
  • 岳阳网站开发建设seo交流博客
  • 运输房产网站建设上海seo排名
  • 企业网站建设开始起步文章手机百度app下载
  • 网站开发工作经验简历网络营销网
  • 顺德网站建设要多少钱页面优化的方法有哪些
  • 网站建设项目怎么写浙江百度推广
  • 做民俗酒店到哪些网站推荐百度指数数据来源
  • 男给女做性按摩网站网络seo软件
  • 贺兰网站建设百度seo 站长工具
  • 网站建设通知书活动推广方案策划
  • 做网站找哪家公司最好重庆seo什么意思
  • 建设网站需要的费用广东网络优化推广
  • 网站模型怎么做seo优化内容
  • 菠菜网站搭建怎么做百度点击率排名有效果吗
  • 汽车软件开发流程株洲seo优化推荐
  • 做影视网站怎么挣钱百度seo快速排名优化软件
  • wordpress段子模板上海网站seo快速排名
  • 网站建设外包还是自己做项目外包平台
  • 大气腐蚀网站建设网站优化排名公司哪家好
  • 灰色网站建设seo关键词优化系统
  • 哈尔滨整站有没有专门帮人推广的公司
  • 网站你懂我意思正能量app网络营销方法有哪些举例
  • 网站建设顾问网站建设seo优化培训
  • 企业网站建设变相收取等级保护费6成人再就业培训班
  • 网站开发与设计开题报告宁波seo推广平台
  • wordpress恶意 文章上海搜索引擎优化1