【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、d
    scanf("%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、d
        double 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💐点点关注,收藏不迷路💐

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

图像梯度-Sobel算子、scharrx算子和lapkacian算子

文章目录 一、认识什么是图像梯度和Sobel算子二、Sobel算子的具体使用三、scharrx算子与lapkacian(拉普拉斯)算子 一、认识什么是图像梯度和Sobel算子 图像的梯度是指图像亮度变化的空间导数&#xff0c;它描述了图像在不同方向上的强度变化。在图像处理和计算机视觉中&#x…

Unity使用Git及GitHub进行项目管理

git: 工作区,暂存区(存放临时要存放的内容),代码仓库区1.初始化 git init 此时展开隐藏项目,会出现.git文件夹 2.减小项目体积 touch .gitignore命令 创建.gitignore文件夹 gitignore文件夹的内容 gitignore中添加一下内容 # This .gitignore file should be place…

2025秋招八股文--网络原理篇

前言 1.本系列面试八股文的题目及答案均来自于网络平台的内容整理&#xff0c;对其进行了归类整理&#xff0c;在格式和内容上或许会存在一定错误&#xff0c;大家自行理解。内容涵盖部分若有侵权部分&#xff0c;请后台联系&#xff0c;及时删除。 2.本系列发布内容分为12篇…

《Linux从小白到高手》综合应用篇:深入理解Linux常用关键内核参数及其调优

1. 题记 有关Linux关键内核参数的调整&#xff0c;我前面的调优文章其实就有涉及到&#xff0c;只是比较零散&#xff0c;本篇集中深入介绍Linux常用关键内核参数及其调优&#xff0c;Linux调优80%以上都涉及到内核的这些参数的调整。 2. 文件系统相关参数 fs.file-max 参数…

VMware虚拟机的下载安装与使用

目录 一、下载VMware虚拟机 步骤1---找到需要的虚拟机下载位置 步骤2---找到下载的安装包安装程序 二、删除干净VMware虚拟机 步骤1--进去服务里面关闭虚拟机服务 步骤2---控制面板里面删除 步骤3---注册表删除HKEY_CURRENT_USER\Software\VMware, Inc. 步骤4---安装在…

政安晨【零基础玩转各类开源AI项目】基于本地Ubuntu (Linux ) 系统应用Gradio-Lite:无服务器 Gradio 完全在浏览器中运行

目录 简介 什么是gradio/lite&#xff1f; 入门 1.导入 JS 和 CSS 2. 创建标签 3. 在标签内编写你的 Gradio 应用程序 更多示例&#xff1a;添加其他文件和要求 多个文件 其他要求 SharedWorker 模式 代码和演示playground 1.无服务器部署 2.低延迟 3. 隐私和安全…

【C语言】文件操作(1)(文件打开关闭和顺序读写函数的万字笔记)

文章目录 一、什么是文件1.程序文件2.数据文件 二、数据文件1.文件名2.数据文件的分类文本文件二进制文件 三、文件的打开和关闭1.流和标准流流标准流 2.文件指针3.文件的打开和关闭文件的打开文件的关闭 四、文件的顺序读写1.fgetc函数2.fputc函数3.fgets函数4.fputs函数5.fsc…

AI开发-三方库-Hugging Face-Pipelines

1 需求 需求1&#xff1a;pipeline支持的任务类型 需求2&#xff1a;推理加速使用CPU还是GPU 需求3&#xff1a;基于pipeline的文本分类示例 需求4&#xff1a;pipeline实现原理 模型使用步骤&#xff08;Raw text -》Input IDs -》Logits -》Predictions&#xff09;&…

k8s 1.28.2 集群部署 harbor v2.11.1 接入 MinIO 对象存储

文章目录 [toc]提前准备什么是 HarborHarbor 架构描述Harbor 安装的先决条件硬件资源软件依赖端口依赖 Harbor 在 k8s 的高可用Harbor 部署Helm 编排YAML 编排创建 namespace导入镜像部署 Redis部署 PostgreSQL部署 Harbor core部署 Harbor trivy部署 Harbor jobservice部署 Ha…

前端考试总结

1HTML标签 h标题标签 块级标签 独占一行 p段落标签 同上 br换行标签 单标签 img图片标签 内联标签:不独占一行(src图片地址 alt图片的替代文字 title鼠标悬停提示文字) a超链接标签 同上 (href跳转路径 target属性{_blank新窗口打开 _self在当前窗口打开}) 列表标签(ul无…

VSCODE 导入cubeide工程

1.下载vscode及插件STM32 VS Code Ectersion 版本号1.0.0&#xff0c;之后这个有导入功能。 2.等待自动安装对应插件&#xff0c;提示缺少什么就补什么 3.在左侧出现stm32图标。点击Import a local project导入本地项目。 4.报错 [{"resource": "/f:V11/cmak…

前端html,css 样式巩固1

想做这样 一个效果 点击图片切换 当前的选中图片 我们使用 原生的js html 来开发这个 直接粘贴代码 相信大家 都能看懂的 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" …

抖音视频制作怎么暂停画面,抖音视频怎么让它有暂停的效果

千万别滥用视频特效&#xff0c;不然它能毁掉你的抖音作品。在创作过程中&#xff0c;应尽量使用类似暂停画面、隐形字幕这样的视觉特效&#xff0c;可以显著提高作品的视觉体验。增强视频表现力的同时&#xff0c;也不会让画面看起来过于夸张。有关抖音视频制作怎么暂停画面的…

Springboot 整合 Java DL4J 实现文物保护系统

&#x1f9d1; 博主简介&#xff1a;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编程&#xff0c;…

2011年国赛高教杯数学建模A题城市表层土壤重金属污染分析解题全过程文档及程序

2011年国赛高教杯数学建模 A题 城市表层土壤重金属污染分析 随着城市经济的快速发展和城市人口的不断增加&#xff0c;人类活动对城市环境质量的影响日显突出。对城市土壤地质环境异常的查证&#xff0c;以及如何应用查证获得的海量数据资料开展城市环境质量评价&#xff0c;研…

应用层协议 序列化

自定义应用层协议 例子&#xff1a;网络版本计算器 序列化反序列化 序列化&#xff1a;将消息&#xff0c;昵称&#xff0c;日期整合成消息-昵称-日期 反序列化&#xff1a;消息-昵称-日期->消息&#xff0c;昵称&#xff0c;日期 在序列化中&#xff0c;定义一个结构体…

【Pycharm默认解释器配置文件】怎样删除配置解释器的无效历史记录?

有时候我们希望删除无效的解释器路径&#xff0c;可以找到这个文件&#xff0c;进行删除修改。 C:\Users\你的用户名\AppData\Roaming\JetBrains\PyCharm2022.3\options\jdk.table.xml直接删除解释器名称对应的一整个<jdk version"2">节点即可&#xff01; …

2023年ICPC亚洲合肥赛区赛 C. Cyclic Substrings

题目 题解 #include<bits/stdc.h> using namespace std; // #define int long long #define ll long long const int maxn 6e6 5; const int mod 998244353; int fail[maxn];//fail[i]表示i结点代表的回文串的最大回文后缀的编号 int len[maxn]; //len[i]表示结点i代…

大模型涌现判定

什么是大模型&#xff1f; 大模型&#xff1a;是“规模足够大&#xff0c;训练足够充分&#xff0c;出现了涌现”的深度学习系统&#xff1b; 大模型技术的革命性&#xff1a;延申了人的器官的功能&#xff0c;带来了生产效率量级提升&#xff0c;展现了AGI的可行路径&#x…

UDP/TCP协议

网络层只负责将数据包送达至目标主机&#xff0c;并不负责将数据包上交给上层的哪一个应用程序&#xff0c;这是传输层需要干的事&#xff0c;传输层通过端口来区分不同的应用程序。传输层协议主要分为UDP&#xff08;用户数据报协议&#xff09;和TCP&#xff08;传输控制协议…