NOI_OPENJUDGE_2.4_7891:一元三次方程求解 题解
来源:互联网 发布:淘宝热线人工服务电话 编辑:程序博客网 时间:2024/05/16 05:10
题目:
描述
有形如:
这样的一个一元三次方程。ax3+bx2+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
不难看出,这道题用枚举是非常简单的。
枚举代码:
#include<cstdio>double a,b,c,d;double f(double x){return a*x*x*x+b*x*x+c*x+d;}int main(){ scanf("%lf %lf %lf %lf",&a,&b,&c,&d); for(double x=-100.00;x<=100.00;x+=0.01) if(f(x)<=0.01&&f(x)>=-0.01) printf("%.2lf ",x); return 0;}
但是,如果范围大一点呢?有许多组测试数据呢?
So,我们用分治来解决这个问题
提示:
记方程f(x)=0,若存在2个数x1和x2,且x1 < x2,f(x1)*f(x2) < 0,则在(x1,x2)之间一定有一个根。
所以,我们只需枚举-100~100之间的整数,再使用分治法求出根
此题代码较为简单,请读者自己完成
上代码!
#include<cstdio>double a,b,c,d;double f(double x){return a*x*x*x+b*x*x+c*x+d;}int main(){ double x1,x2; scanf("%lf %lf %lf %lf",&a,&b,&c,&d); for(int x=-100;x<100;x++) { x1=x;x2=x1+1; if(!f(x1))printf("%.2lf ",x1); if(f(x1)*f(x2)<0) { double mid; while(x1+0.001<=x2) { mid=(x1+x2)/2; if(f(x1)*f(mid)<0)x2=mid; else x1=mid; } printf("%.2lf ",x1); } } return 0;}
阅读全文
1 0
- NOI_OPENJUDGE_2.4_7891:一元三次方程求解 题解
- 洛谷P1024 一元三次方程求解 题解
- 一元三次方程求解
- 一元三次方程求解
- 一元三次方程求解
- 一元三次方程求解
- 一元三次方程求解
- 一元三次方程求解
- 一元三次方程求解
- 一元三次方程求解
- 一元三次方程求解
- 一元三次方程求解
- 一元三次方程求解
- 一元三次方程求解
- 一元三次方程求解
- vijos p1116(codevs 1038 )一元三次方程求解 题解
- 一元三次方程的求解
- 求解一元三次方程--c++
- android修改底层键值
- Spring整合Quartz
- pdf.js实际应用pdf文件在手机版浏览
- 算法之卡特兰数
- 【React Native】从源码一步一步解析它的实现原理
- NOI_OPENJUDGE_2.4_7891:一元三次方程求解 题解
- Digit Puzzle UVA
- java------线程同步方法
- JZOJ 5111. 【usaco2017_Mar Platinum】Modern Art
- USACO
- gvim 出现 vundle 出现vundle#installer#new error
- bower下载安装及使用
- 挑战:数据提取(2016tabfun面试题)
- CV主要网站