解一元三次方程noip2001
题目描述
有形如:ax^3+bx^2+cx^1+dx^0=0ax3+bx2+cx1+dx0=0 这样的一个一元三次方程。给出该方程中各项的系数(a,b,c,da,b,c,d均为实数),并约定该方程存在三个不同实根(根的范围在-100−100至100100之间),且根与根之差的绝对值\ge 1≥1。要求由小到大依次在同一行输出这三个实根(根与根之间留有空格),并精确到小数点后22位。
提示:记方程f(x)=0f(x)=0,若存在22个数x_1x1和x_2x2,且x_1<x_2x1<x2,f(x_1) \times f(x_2)<0f(x1)×f(x2)<0,则在(x_1,x_2)(x1,x2)之间一定有一个根。
输入格式
一行,44个实数A,B,C,DA,B,C,D。
输出格式
一行,33个实根,并精确到小数点后22位。
输入输出样例
输入 #1复制
1 -5 -4 20
输出 #1复制
-2.00 2.00 5.00
一、枚举法
cout.precision设置小数点位数;
cout.setf(ios::fixed)以定点形式显示浮点数;
#include<cstdio>
#include<iostream>
#include<iomanip>
#include<cstdlib>
using namespace std;int pow(int x,int n) {int res = 1;for(int i = 0; i < n; i++) res *= x;return res;
}int main() {double x,f,a,b,c,d;cin >> a >> b >> c >> d;cout.precision(2); //设置精度,即小数点位数 cout.setf(ios::fixed); //以定点形式显示浮点数 for(double i = -10000; i <= 10000; x = (++i) / 100.0) {f = x * x * x * a + x * x * b + x * c + d;if(f >= -0.01 && f <= 0.01)cout << x << ' '; }cout << endl; return 0;
}
二、二分法
记方程为f(x) = 0,若存在两个不同的数和
,且f(
) * f(
) < 0,则在(
,
)之间一定有一个根;
当已知区间(a,b)内有一个根时,可用二分法求解,若区间(a,b)内有根,则必有f(a)*f(b) < 0。重复执行一下过程:
令m = (a + b) / 2;
- 若 a + 0.000 1 > b 或 f(m) = 0,则可以确定根为m,并退出过程;
- 若 f(a) * f(m) < 0,则必有 f(m) * f(a) < 0 根在区间(a,m)中,故对区间重复该过程;
- 若 f(a) * f(m) < 0,则必有 f(m) * f(b) < 0 根在区间(m,b)中,对区间重复该过程;
执行完毕,就可以得到精确到0.000 1的根;
所以,根据"根与根之差的绝对值 >= 1 “,先对区间[-100,-99]、[-99,-98]…[99,100]进行枚举,确定这些区间内是否有解,然后对所有有解的区间使用二分法就可以了。
#include<cstdio>
#include<iostream>
#include<iomanip>
#include<cstdlib>
using namespace std;
float a, b, c, d;
int n;
float ans[4];float Equation(float x) {return ((a * x + b) * x + c) * x + d;
}void solve(float l,float r) {if(Equation(l) * Equation(r) > 0 && ((r-l) < 1 || n >= 2))//区间等于1以内没有解,返回;//或者区间长度大于一,并且已经得到两个解,则只剩下一个解,如果该区间两端函数值相乘大于0,则可以直接返回,减少不必要的时间浪费return;float mid = (l + r) / 2;if(Equation(mid) <= 1e-4 && Equation(mid) >= -1e-4) {ans[++n] = mid;return;}solve(l,mid),solve(mid,r);
}int main() {cin >> a >> b >> c >> d;solve(-100,100);cout << fixed << setprecision(2) << ans[1] << ' ' << ans[2] << ' ' << ans[3] << endl; return 0;
}
长路漫漫,未来可期;
解一元三次方程noip2001相关推荐
- 问题三十七:C++怎么解一元四次方程?(2)——怎么解一元三次方程
37.2 怎么解一元三次方程? 用"盛金公式"求解: ----------------------------------------------main.cpp -------- ...
- 盛金公式解一元三次方程_一元三次方程解法(卡尔丹公式法盛金公式法)
卡尔丹公式法 特殊型一元三次方程 X^3+pX+q=0 (p.q∈R) 判别式Δ=(q/2)2+(p/3)3 卡尔丹公式 X1=(Y1)(1/3)+(Y2)(1/3) X2= (Y1)(1/3)ω+( ...
- 解一元三次方程方程问题细节探讨
解一元三次方程 虽然我是一个新手,按"规矩"应该要经常在博客里面把自己的错误都写出来做个总结,但是我比较保守,总是觉得博客是一个社交平台,一些相对不太成熟的东西还是写个word文档 ...
- 盛金公式解一元三次方程_【国际数学竞赛】高次方程求根
对于一元二次方程 ,我们由求根公式可得: . 对于一元三次方程 ,我们有 卡尔丹公式法和盛金公式法.不过公式比较冗长.不易计算,但我们还是有方法计算的,那么如果是一元四次.一元五次甚至更高呢? 遇到高 ...
- 盛金公式解一元三次方程_盛金公式解一元三次方程
Module Shengjin_mod Implicit None contains Function Cubic_equation(Co) Result (X) !盛金公式求解一元三次方程 !默认浮 ...
- c++解一元三次方程
求解一元三次方程组 转自:http://blog.csdn.net/u012221917/article/details/17175793 float f(float w_f, float x_f, ...
- 牛顿迭代法解一元三次方程
题目描述 有形如:ax^3+bx^2+cx^1+dx^0=0ax3+bx2+cx1+dx0=0 这样的一个一元三次方程.给出该方程中各项的系数(a,b,c,da,b,c,d均为实数),并约定该方程存在 ...
- matlab复数方程的根,matlab解一元三次方程,得到的都是复数根。
对于你昨天的那个方程,是典型的非线性方程,我修改了程序,用fsolve函数来解,程序在下面.先新建一个m文件,再把以下全部程序直接复制进m文件中,运行即可,不要在主窗口中运行,用m文件来写程序,比直接 ...
- EXCEL 单变量求解 解一元三次方程
目标单元格:是公式所在的单元格,也是方程所在的单元格,如图中的B1=3*A1^3-100*A1^2+300*A1-300 目标值:即目标单元格的值,想要让单元格的值变成多少?即要让方程的结果等于多少 ...
最新文章
- perl脚本的默认参数
- intel服务器芯片组介绍,Intel芯片组的简介
- Mybatis(13)动态sql语句if/where/foreach
- Leetcode 俄罗斯套娃信封问题
- ssh客户端_Termius for Mac(SSH客户端) v6.3.0
- [debug+Python] 复制字典不能直接用 ‘=’,要用dict_name.copy()
- 【渝粤教育】国家开放大学2018年春季 0092-22T民法 参考试题
- 微服务学习之02支付模块构建(单个、集群)【Hoxton.SR1版】
- 2013=726 整合,优化,利用自身资源。 让自己的时间更有意义,最大化利用
- Navicat 数据库可视化工具远程连接MySQL及基本操作
- 合肥Java面试常考题_java面试常考题-String
- 免费IDM注册机下载
- 刘銮雄-公道不在人心,是非只在时势
- MySQL死锁产生的原因和解决方法
- 数学中的向量相关知识
- CW MCU v11.1学习笔记1
- 谈ArcGIS分数标注的问题 分子分母形式
- 批量识别医疗票据【第1版】
- 3D视觉基础(基本原理及3D传感器基本参数)
- matlab实现水塔水流量问题