信息学奥赛一本通(1238:一元三次方程求解)
1238:一元三次方程求解
时间限制: 1000 ms 内存限制: 65536 KB
提交数: 6364 通过数: 3241
【题目描述】
形如:ax^3+bx^2+cx+d=0 这样的一个一元三次方程。
给出该方程中各项的系数(a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在−100至100之间),且根与根之差的绝对值≥1。要求由小到大依次在同一行输出这三个实根(根与根之间留有空格),并精确到小数点后2位。
【输入】
一行,包含四个实数a,b,c,d,相邻两个数之间用单个空格隔开。
【输出】
一行,包含三个实数,为该方程的三个实根,按从小到大顺序排列,相邻两个数之间用单个空格隔开,精确到小数点后2位。
【输入样例】
1.0 -5.0 -4.0 20.0
【输出样例】
-2.00 2.00 5.00
【分析】
数学中,一个十分基本的问题是求给定方程的解。如下列方程:
4X^5 - 3X^4 + 2X^3 + 6X^2 + 5X - 7 = 0
x+ sinx - 3=0
x^10 -10x = 0
lgx - x^2 + 7x + 5 = 0
它们的一般形式可表示为:f(x)=0。方程的根或解是使f(x)等于0的那些x的值。这里,我们仅考虑x为实数的情况。方程f(x)=0可能无根,有单根、多根,甚至有无穷多根。求解这个问题,可以采用枚举法,也可以采用分治法。
方法1:枚举法。分析一下,根的范围在-100到100之间,以根为枚举对象,枚举范围是-100到100,因为结果要保留两位小数,故此,步长为0.001。 将枚举的根,代入原方程,利用误差法,对原方程式进行一一验证,找出方程的解。
【参考代码1】
#include <stdio.h>
#include <math.h>
double a,b,c,d;
double f(double x)
{return ((a*x+b)*x+c)*x+d;
}
int main()
{double i;scanf("%lf%lf%lf%lf",&a,&b,&c,&d);for(i=-100;i<=100;i+=0.001)if(fabs(f(i))<1e-6)printf("%.2lf ",i);printf("\n");return 0;
}
方法2:分治法。二分法要求将方程改写成f(x)=0的形式,然后y=f(x)。先选取x1和x2两点,使f(x1)和f(x2)异号。由于y=f(x)是连续不断的曲线,故在x1和x2之间至少有一个根存在。先将可变区间[x1,x2]两等分,求出其中点,即x3=(x1+x2)/2,然后求出函数在中点处的值f(x3)。若f(x3)与f(x1)同号,则新的可变区间就是[x3,x2];如果异号,则新的可变区间是[x1,x3];如果f(x3)=0,则求解完毕。如此重复叠代下去,直至可变区间之长度小于某个预先给定的值为止,或者达到f(x) = 0。
【参考代码2】
#include<stdio.h>
#include<math.h>
double a,b,c,d;
double F(double x)
{return ((a*x+b)*x+c)*x+d;
}
int main()
{int i;double x1,x2,xb;scanf("%lf%lf%lf%lf",&a,&b,&c,&d);for(i=-100;i<=100;i++){x1=i;x2=i+0.99999; //注意此处不能用 x2=i+1,否则 else if 分支求一个,if分支又求一个,重复了if(fabs(F(x1))<1e-6)printf("%.2lf ",x1);else if(F(x1)*F(x2)<0){xb=(x1+x2)/2;while(fabs(x2-x1)>1e-6) // x1 != x2, 二分法找到根 {if(F(x1)*F(xb)>0)x1=xb;elsex2=xb;xb=(x1+x2)/2; }printf("%.2lf ",xb); }}printf("\n");return 0;
}
http://ybt.ssoier.cn:8088/problem_show.php?pid=1238
信息学奥赛一本通(1238:一元三次方程求解)相关推荐
- c++一本通 1238一元三次方程求解
题目可以在7种二分查找法的总结中 找到 这道题 需要用到一些数学知识: 关于一个方程ax3+bx2+cx+d=0ax3+bx2+cx+=0, 一定有三个复数解, 并且题目 保证 所有解在 实数范围内, ...
- 信息学奥赛一本通 1101:不定方程求解 | OpenJudge NOI 2.1 7650 | 小学奥数 7650
[题目链接] ybt 1101:不定方程求解 OpenJudge NOI 2.1 7650:不定方程求解 OpenJudge NOI 小学奥数 7650:不定方程求解 [题目考点] 1. 枚举 [解题 ...
- 信息学奥赛一本通(基础算法与数据结构-题解汇总目录)
信息学奥赛一本通(C++版)在线评测系统 基础(二)基础算法 更新中...... 第一章高精度计算 1307[例1.3]高精度乘法 1308[例1.5]高精除 1309[例1.6]回文数(Noip ...
- 信息学奥赛一本通超详细题解,动画图文题解
内容来源于微信公众号:大神编程.已经过原文作者授权. 更新时间:2020-11-5 现在开始更新基础算法题. 个人感言:从未见过如此详细的题解,动画.图文结合,适合任何水平的选手.尤其是特别适合自学的 ...
- 【信奥赛一本通】1238:一元三次方程求解(详细代码)
[分治算法]一元三次方程求解 1.[题目描述] 2.[代码] 1.[题目描述] [题目描述] 形如:ax3+bx2+cx+d=0 这样的一个一元三次方程. 给出该方程中各项的系数(a,b,c,d均为实 ...
- 信息学奥赛一本通(1101:不定方程求解)
1101:不定方程求解 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 18175 通过数: 14383 [题目描述] 给定正整数a,b,c.求不定方程 a ...
- P1024 [NOIP2001 提高组] 一元三次方程求解 /1238:一元三次方程求解
P1024 [NOIP2001 提高组] 一元三次方程求解 /1238:一元三次方程求解 # [NOIP2001 提高组] 一元三次方程求解 ## 题目描述 有形如:$a x^3 + b x^2 + ...
- 信息学奥赛一本通 提高篇 第六部分 数学基础 相关的真题
第1章 快速幂 1875:[13NOIP提高组]转圈游戏 信息学奥赛一本通(C++版)在线评测系统 第2 章 素数 第 3 章 约数 第 4 章 同余问题 第 5 章 矩阵乘法 第 6 章 ...
- 信息学奥赛一本通 (C++)上机练习
信息学奥赛一本通(C++)上机练习 此书为娃儿的第一本刷题书.娃儿现在四年级 ,希望他能坚持下来.特开贴加油 luogu: disangan223 第一部分 C++语言 第一章 C++语言入门 T10 ...
最新文章
- 关于 HTML5 的 11 个让人难以接受的事实
- 在桌面上创建一个宽带连接服务器,win7宽带连接怎么创建桌面
- python策略模式_设计模式(python实现):策略模式
- [Linux] Vmware 15安装CentOs后显示网络不可用
- How to show out three rows from the same databand On A4?
- sklearn 下的 ensemble learning
- 将python(py文件)转换成.exe方法
- 2021-11-25 使用kali自带的SET工具制作钓鱼网站
- android 邮箱 推荐,Android邮箱谁最棒?最新热门邮箱App横向测试
- 我的编程之路点滴记录(五)
- python爬虫英文单词_非常适合新手的一个Python爬虫项目:打造一个英文词汇量测试脚本...
- uniapp:一个多边形图片裁剪插件
- 加州大学圣地亚哥分校计算机科学排名,加州大学圣地亚哥分校UCSD计算机科学Computer Science专业排名第37位(2021年THE世界大学商科排名)...
- 实用又救急!快速恢复误删文件!
- (九)巴菲特与索罗斯的投资习惯:术业有专攻
- 为了防止别人非法使用计算机可以通过,[单选] 为了防止别人非法使用计算机,可以通过为计算机设置口令()。...
- java之TimeUnit.SECONDS.sleep()详细分析(全)
- SpringBoot-七牛云对象存储库
- 树域,子域和林的创建与加入
- 空间计量 python_【空间计量教程】空间计量及Geoda、Stata、R操作(线性回归篇)...