题目描述

有形如: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;

  1. 若 a + 0.000 1 > b 或 f(m) = 0,则可以确定根为m,并退出过程;
  2. 若 f(a) * f(m) < 0,则必有 f(m) * f(a) < 0 根在区间(a,m)中,故对区间重复该过程;
  3. 若 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相关推荐

  1. 问题三十七:C++怎么解一元四次方程?(2)——怎么解一元三次方程

    37.2 怎么解一元三次方程? 用"盛金公式"求解: ----------------------------------------------main.cpp -------- ...

  2. 盛金公式解一元三次方程_一元三次方程解法(卡尔丹公式法盛金公式法)

    卡尔丹公式法 特殊型一元三次方程 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)ω+( ...

  3. 解一元三次方程方程问题细节探讨

    解一元三次方程 虽然我是一个新手,按"规矩"应该要经常在博客里面把自己的错误都写出来做个总结,但是我比较保守,总是觉得博客是一个社交平台,一些相对不太成熟的东西还是写个word文档 ...

  4. 盛金公式解一元三次方程_【国际数学竞赛】高次方程求根

    对于一元二次方程 ,我们由求根公式可得: . 对于一元三次方程 ,我们有 卡尔丹公式法和盛金公式法.不过公式比较冗长.不易计算,但我们还是有方法计算的,那么如果是一元四次.一元五次甚至更高呢? 遇到高 ...

  5. 盛金公式解一元三次方程_盛金公式解一元三次方程

    Module Shengjin_mod Implicit None contains Function Cubic_equation(Co) Result (X) !盛金公式求解一元三次方程 !默认浮 ...

  6. c++解一元三次方程

    求解一元三次方程组 转自:http://blog.csdn.net/u012221917/article/details/17175793 float f(float w_f, float x_f, ...

  7. 牛顿迭代法解一元三次方程

    题目描述 有形如:ax^3+bx^2+cx^1+dx^0=0ax3+bx2+cx1+dx0=0 这样的一个一元三次方程.给出该方程中各项的系数(a,b,c,da,b,c,d均为实数),并约定该方程存在 ...

  8. matlab复数方程的根,matlab解一元三次方程,得到的都是复数根。

    对于你昨天的那个方程,是典型的非线性方程,我修改了程序,用fsolve函数来解,程序在下面.先新建一个m文件,再把以下全部程序直接复制进m文件中,运行即可,不要在主窗口中运行,用m文件来写程序,比直接 ...

  9. EXCEL 单变量求解 解一元三次方程

    目标单元格:是公式所在的单元格,也是方程所在的单元格,如图中的B1=3*A1^3-100*A1^2+300*A1-300 目标值:即目标单元格的值,想要让单元格的值变成多少?即要让方程的结果等于多少 ...

最新文章

  1. LeetCode之Reverse Integer
  2. tukey检测_回到数据分析的未来:Tukey真空度的整洁实现
  3. Javascript 操作元素Class属性的问题
  4. 加载java ie停止工作_打开网页,IE浏览器提示Internet Explorer 已停止工作什么原因?怎么解决?...
  5. django 开发 - 小心模板文件的编码格式(utf-8)
  6. JavaScript 语言精粹 高清PDF中文版
  7. 第1章—Spring之旅—简化Spring的java开发
  8. linux常用命令V1.1
  9. FPGA 独立按键消抖
  10. 《Linux设备驱动开发详解(第3版)》(即《Linux设备驱动开发详解:基于最新的Linux 4.0内核》)前言
  11. 身体不同部位锻炼相关英语表达
  12. 淘宝 NPM 镜像 node删除node_modules WebStorm license server address
  13. 两个路由器如何通过一根网线组建局域网(非wifi桥接方式)
  14. php图片留白,img底部留白问题的六大解决方法
  15. Centos8安装常用软件及家用操作命令
  16. rabbitmq组件断链重连机制
  17. BAT bat .bat 脚本,windows下的bat命令
  18. 【ReID】局部特征
  19. 动手学bert课程笔记
  20. mysql drop后回收站怎么恢复吗_回收站清空了怎么恢复

热门文章

  1. There was a temporary DNS error. Try refreshing the page.
  2. Python爬虫实例:测单词量并生成错词本
  3. 微信小程序网悦新闻开发--视频模块开发(四)
  4. mysql barracuda_MySQL Antelope和Barracuda的区别分析
  5. RFID防伪溯源解决方案
  6. Java:青蛙跳台阶
  7. VS2019 windows驱动开发环境配置
  8. It’s Only Natural: An Excessively Deep Dive Into Natural Gradient Optimization
  9. 几个实用的IDEA插件 Java开发辅助神器!
  10. mysql 怎么表示正无穷_“2到正无穷”用符号怎么表示?