【NOIP提高组】一元三次方程求解

【NOIP提高组】一元三次方程求解


💐The Begin💐点点关注,收藏不迷路💐

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

输入
输入该方程中各项的系数(a,b,c,d均为实数)

输出

由小到大依次在同一行输出这三个实根(根与根之间留有空格),并精确到小数点后2位

样例输入

1 -5 -4 20

样例输出

-2.00 2.00 5.00

1、C语言实现:

#include <stdio.h>
#include <math.h>// 定义函数 equation,用于计算给定 x 和系数 a、b、c、d 的方程值
double equation(double x, double a, double b, double c, double d) {return a * x * x * x + b * x * x + c * x + d;
}int main() {double a, b, c, d;// 从用户输入读取方程的系数 a、b、c、dscanf("%lf %lf %lf %lf", &a, &b, &c, &d);for (double i = -100; i <= 100; i += 0.01) {double j = i + 0.01;// 计算 i 处的方程值double value_i = equation(i, a, b, c, d);// 计算 j 处的方程值double value_j = equation(j, a, b, c, d);if (value_i * value_j < 0) {// 如果 i 和 j 处的方程值乘积小于 0,说明在区间 (i,j) 中有根double left = i;double right = j;while (right - left > 0.0001) {// 计算区间的中点double mid = (left + right) / 2;// 计算中点处的方程值double mid_value = equation(mid, a, b, c, d);if (mid_value * value_i < 0) {// 如果中点值和 i 处值的乘积小于 0,说明根在区间 (left,mid)right = mid;} else {// 否则根在区间 (mid,right)left = mid;}}// 输出找到的根,精确到小数点后两位printf("%.2lf ", left);}}return 0;
}

在这里插入图片描述

以下是对上述 C 语言代码求解一元三次方程的解法解析:

一、问题分析

  1. 已知条件

    • 有形如 a x 3 + b x 2 + c x + d = 0 ax^3 + bx^2 + cx + d = 0 ax3+bx2+cx+d=0 的一元三次方程。
    • 方程存在三个不同实根,且根的范围在 -100 至 100 之间,根与根之差的绝对值大于等于 1。
    • 若存在两个数 x 1 x_1 x1 x 2 x_2 x2,且 x 1 < x 2 x_1\lt x_2 x1<x2 f ( x 1 ) × f ( x 2 ) < 0 f(x_1)\times f(x_2)\lt0 f(x1)×f(x2)<0,则在 ( x 1 , x 2 ) (x_1,x_2) (x1,x2) 之间一定有一个根。
  2. 求解目标

    • 求出满足条件的三个实根,并从小到大依次输出,精确到小数点后两位。

二、算法思路

  1. 遍历区间

    • 从 -100 开始,以 0.01 为步长遍历到 100。对于每个值 i i i,计算方程在该点的值 v a l u e _ i value\_i value_i
    • 同时计算下一个点 j = i + 0.01 j = i + 0.01 j=i+0.01 处的方程值 v a l u e _ j value\_j value_j
  2. 确定根的区间

    • 如果 v a l u e _ i × v a l u e _ j < 0 value\_i\times value\_j\lt0 value_i×value_j<0,说明在区间 ( i , j ) (i,j) (i,j) 之间必然存在一个根。
  3. 二分法逼近根

    • 定义区间的左右边界 l e f t = i left = i left=i r i g h t = j right = j right=j
    • 不断进行二分查找,直到区间长度小于一个很小的阈值(这里是 0.0001)。
    • 在每次迭代中,计算区间的中点 m i d = ( l e f t + r i g h t ) / 2 mid = (left + right) / 2 mid=(left+right)/2 以及中点处的方程值 m i d _ v a l u e mid\_value mid_value
    • 如果 m i d _ v a l u e × v a l u e _ i < 0 mid\_value\times value\_i\lt0 mid_value×value_i<0,说明根在区间 ( l e f t , m i d ) (left,mid) (left,mid),更新右边界 r i g h t = m i d right = mid right=mid;否则根在区间 ( m i d , r i g h t ) (mid,right) (mid,right),更新左边界 l e f t = m i d left = mid left=mid
  4. 输出结果

    • 当找到一个根后,输出该根,精确到小数点后两位。
    • 继续遍历区间,寻找另外两个根。

三、代码解释

  1. equation 函数

    • 该函数用于计算给定 x x x 值下方程的值。
    • 接收系数 a a a b b b c c c d d d 和变量 x x x,返回 a x 3 + b x 2 + c x + d ax^3 + bx^2 + cx + d ax3+bx2+cx+d 的值。
  2. main 函数

    • 首先读取输入的方程系数 a a a b b b c c c d d d
    • 然后通过循环遍历 -100 到 100 的区间,步长为 0.01。
    • 对于每个点,计算其方程值,并与下一个点的方程值进行比较,确定根的区间。
    • 一旦确定根的区间,使用二分法逼近根,并输出结果。

四、时间复杂度和空间复杂度分析

  1. 时间复杂度

    • 主要的时间消耗在遍历区间和二分法查找上。遍历区间的时间复杂度为 O ( 20000 ) O(20000) O(20000)(因为从 -100 到 100,步长为 0.01,共 20000 个点)。
    • 对于每个可能的根区间,二分法查找的时间复杂度为 O ( l o g ( 0.01 / s t e p ) ) O(log(0.01/step)) O(log(0.01/step)),其中 s t e p step step 是遍历区间的步长。
    • 总体时间复杂度近似为 O ( 20000 × l o g ( 0.01 / 0.01 ) ) = O ( 20000 ) O(20000\times log(0.01/0.01)) = O(20000) O(20000×log(0.01/0.01))=O(20000)
  2. 空间复杂度

    • 代码中只使用了有限的几个变量,空间复杂度为 O ( 1 ) O(1) O(1)

2、JAVA实现:

import java.util.Scanner;class Main {// 定义一个静态方法,用于计算方程的值public static double equation(double x, double a, double b, double c, double d) {return a * x * x * x + b * x * x + c * x + d;}public static void main(String[] args) {Scanner scanner = new Scanner(System.in);// 读取输入的方程系数 a、b、c、ddouble a = scanner.nextDouble();double b = scanner.nextDouble();double c = scanner.nextDouble();double d = scanner.nextDouble();for (double i = -100; i <= 100; i += 0.01) {// 定义 j 为下一个步长的值double j = i + 0.01;// 计算 i 处的方程值double value_i = equation(i, a, b, c, d);// 计算 j 处的方程值double value_j = equation(j, a, b, c, d);if (value_i * value_j < 0) {// 如果 i 和 j 处的方程值乘积小于 0,说明在区间 (i,j) 中有根double left = i;double right = j;// 使用二分法逼近根while (right - left > 0.0001) {double mid = (left + right) / 2;double midValue = equation(mid, a, b, c, d);if (midValue * value_i < 0) {// 如果中点值和 i 处值的乘积小于 0,说明根在区间 (left,mid)right = mid;} else {// 否则根在区间 (mid,right)left = mid;}}// 输出找到的根,精确到小数点后两位System.out.printf("%.2f ", left);}}}
}

在这里插入图片描述


💐The End💐点点关注,收藏不迷路💐

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/452292.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PyQt 入门教程(3)基础知识 | 3.1、使用QtDesigner创建.ui文件

文章目录 一、使用QtDesigner创建.ui文件1、创建.ui文件2、生成.py文件3、使用新生成的.py文件4、编辑新生成的.py文件 一、使用QtDesigner创建.ui文件 1、创建.ui文件 打开PyCharm&#xff0c;使用自定义外部工具QtDesigner创建mydialog.ui文件&#xff0c;如下&#xff1a; …

基于因果推理的强对流降水临近预报问题研究

我国地域辽阔&#xff0c;自然条件复杂&#xff0c;灾害性天气种类繁多&#xff0c;地区差异性大。雷雨大风、冰雹、短时强降水等强对流天气是造成经济损失、危害生命安全最严重的一类灾害性天气。由于强对流降水具有高强度、小空间尺度等特点&#xff0c;一直是气象预报领域的…

python爬虫技术实现酷我付费破解下载

python爬虫技术实现酷我付费破解下载 1.python编程环境 python解释器:pyhton3版本 代码编辑器:Vscode,PyCharm 2.实现爬虫程序过程 2.1浏览器访问网站的过程 在浏览器导航栏中输入域名并回车(在按下回车的那一瞬间浏览器向网站发送了一个http请求)当网站接收到请求后向…

【Vue】Vue3(1)

文章目录 1 Vue3简介2 Vue3带来了什么2.1 性能的提升2.2 源码的升级2.3 拥抱TypeScript2.4 新的特性 3 创建Vue3.0工程3.1 使用 vue-cli 创建3.2 使用 vite 创建3.3 main.js3.4 App.vue 4 常用 Composition API4.1 拉开序幕的setup4.1.1 setup函数的两种返回值4.1.2 注意点4.1.…

Python酷玩之旅_数据分析入门(matplotlib)

导览 前言matplotlib入门1. 简介1.1 Pairwise data1.2 Statistical distributions1.3 Gridded data1.4 Irregularly gridded data1.5 3D and volumetric data 2. 实践2.1 安装2.2 示例 结语系列回顾 前言 翻看日历&#xff0c;今年的日子已划到了2024年10月19日&#xff0c;今天…

【Linux-进程间通信】vscode使用通信引入匿名管道引入

一、新系统&#xff0c;新软件 1.新系统 哈喽宝子们&#xff0c;从今以后我们不再使用风靡一时的CentOS系统了&#xff0c;因为CentOS已经不在维护了&#xff0c;各大公司几乎也都从CentOS转入其他操作系统了&#xff1b;我们现在由原来的CentOS系统切换到最新的Ubuntu系统&a…

[LeetCode] 232. 用栈实现队列

请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作&#xff08;push、pop、peek、empty&#xff09;&#xff1a; 实现 MyQueue 类&#xff1a; void push(int x) 将元素 x 推到队列的末尾int pop() 从队列的开头移除并返回元素int peek() 返回队列开头…

嵌入式开发中的 C 语言

目录 一、嵌入式与 C 语言的紧密关系 二、C 语言的特点与优势 &#xff08;二&#xff09;灵活的语法机制与直接访问硬件能力 &#xff08;三&#xff09;高效的运行效率 三、C 语言在嵌入式开发中的应用场景 &#xff08;一&#xff09;编译器与源代码转换 &#xff08;…

使用LSPatch+PlusNE修改手机软件

一、问题概述 国内使用一些软件&#xff0c;即使科学上网&#xff0c;打开都是网络错误&#xff0c;更换节点同样如此。 二、软件下载 通过官网或者正规商店(如Google play)下载并且安装。 是的&#xff0c;先要下载一个无法使用的版本&#xff0c;后续对其进行修改。 三、下…

Vulnhub打靶-matrix-breakout-2-morpheus

基本信息 靶机下载&#xff1a;https://pan.baidu.com/s/1kz6ei5hNomFK44p1QT0xzQ?pwdy5qh 提取码: y5qh 攻击机器&#xff1a;192.168.20.128&#xff08;Windows操作系统&#xff09; 靶机&#xff1a;192.168.20.0/24 目标&#xff1a;获取2个flagroot权限 具体流程 …

【AIGC】ChatGPT与人类理解力的共鸣:人机交互中的心智理论(ToM)探索

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 &#x1f4af;前言&#x1f4af;心智理论(Theory of Mind,ToM)心智理论在心理学与神经科学中的重要性心智理论对理解同理心、道德判断和社交技能的重要性结论 &#x1f4af;乌得勒支大学研究对ChatGPT-4…

深入 C 语言内存管理:优化策略与实践案例

目录 引言 C 语言内存管理机制概览 内存区域划分 内存对齐与填充 内存访问效率 内存管理优化策略 避免内存泄漏 减少内存碎片 优化结构体布局 提高内存访问效率 实践案例 案例一&#xff1a;智能指针实现 案例二&#xff1a;内存池实现 案例三&#xff1a;结构体…

PDT 数据集:首个基于无人机的高精密度树木病虫害目标检测数据集

2024-09-24&#xff0c;由中国山东计算机科学中心、北京大学等机构联合创建了Pests and Diseases Tree&#xff08;PDT&#xff09;数据集&#xff0c;目的解决农业领域中病虫害检测模型开发中专业数据集缺失的问题。通过集成公共数据和网络数据&#xff0c;进一步推出了Common…

MySQL程序介绍<一>

目录 MySQL程序简介 mysqld - MySQL 服务器 ​编辑 mysql - MySQL 命令⾏客⼾端 MySQL程序简介 1.MySQL安装完成通常会包含如下程序&#xff1a; Linux系统程序⼀般在 /usr/bin⽬录下&#xff0c;可以通过命令查看 windows系统⽬录&#xff1a; 你的安装路径\MySQL Server…

【LeetCode】123.买卖股票的最佳时间

清晰明了的思路是解决问题的至上法宝。如何把一个复杂的问题拆成简单的问题&#xff0c;就是我们需要考虑的。 1. 题目 2. 思想 这道题虽然是难题&#xff0c;但是思想比较简单。 题目要求说至多买卖两次&#xff0c;也就是说&#xff0c;也可以买卖一次&#xff0c;这种情况…

MySQL-16.DQL-分页查询

一.DQL-分页查询 -- 分页查询 -- 1. 从 起始索引0 开始查询员工数据&#xff0c;每页展示5条记录 select * from tb_emp limit 0,5; -- 2.查询 第1页 员工数据&#xff0c;每页展示5条记录 select * from tb_emp limit 0,5; -- 3.查询 第2页 员工数据&#xff0c;每页展示5条记…

数据中台业务架构图

数据中台的业务架构是企业实现数据驱动决策和业务创新的关键支撑。它主要由数据源层、数据存储与处理层、数据服务层以及数据应用层组成。 数据源层涵盖了企业内部各个业务系统的数据&#xff0c;如 ERP、CRM 等&#xff0c;以及外部数据来源&#xff0c;如社交媒体、行业数据…

ES-入门-javaApi-文档-新增-删除

新增指定索引的文档数据的代码如下&#xff1a; package com.atgulgu.es.test;import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.http.HttpHost; import org.elasticsearch.action.index.IndexRequest; import org.elasticsearch.action.index.IndexRe…

Java项目-基于springboot框架的校园在线拍卖系统项目实战(附源码+文档)

作者&#xff1a;计算机学长阿伟 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、ElementUI等&#xff0c;“文末源码”。 开发运行环境 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBoot、Vue、Mybaits Plus、ELementUI工具&#xff1a;IDEA/…

webstorm 编辑器配置及配置迁移

1.下载地址 WebStorm&#xff1a;JetBrains 出品的 JavaScript 和 TypeScript IDE 其他版本下载地址 2.安装 点击下一步安装&#xff0c;可根据需要是否删除已有版本 注意&#xff1a; 完成安装后需要激活 3.设置快捷键 以下为个人常用可跳过或根据需要设置 如&#xff1a…