分治5--一元三次方程求解
分治5--一元三次方程求解
打赏
一、心得
一定要先想清楚,套路是固定的
如果有位置不懂,就举例子举出来吧
先说明等于的情况
然后再是不等于的情况
二、题目及分析
一元三次方程求解
总时间限制: 1000ms 内存限制: 65536kB
描述
有形如: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
三、代码及结果
1 /* 2 如果有位置不懂,就举例子举出来吧 3 4 */ 5 #include <iostream> 6 using namespace std; 7 8 double a,b,c,d; 9 double f(double x){ 10 double f=a*x*x*x+b*x*x+c*x+d; 11 return f; 12 } 13 14 //枚举法 从-100,-99.99,...,一直枚举到100 15 void findAns(){ 16 cout<<"枚举:"<<endl; 17 for(double x=-10000;x<=10000;x++){//10000是为了方便x++,也可(x/100)++ 18 double x1=x/100-0.005,x2=x/100+0.005; 19 //if(f(x1)*f(x2)<=0)//有错 在99.99的时候,有99.985; 和99.98的时候,也有99.985, 20 // 如果是99.985,那 99.99和99.98都成立 21 if(f(x1)*f(x2)<0||f(x1)==0) 22 printf("%.2f ",x/100); 23 } 24 cout<<endl; 25 } 26 27 //分治 28 //这个之前写的有问题 29 void findAns2(){ 30 cout<<"分治:"<<endl; 31 for(double x=-100;x<=100;x++){ 32 double x1=x,x2=x+1; 33 //先输出等于的情况 34 if(f(x1)==0) printf("%.2f ",x1); 35 else if(f(x1)*f(x2)<0){//符合条件 36 while(x2-x1>=0.001){ 37 double mid=(x1+x2)/2; 38 if(x1*mid<=0) x2=mid; 39 else x1=mid; 40 } 41 printf("%.2f ",x1); 42 } 43 44 } 45 cout<<endl; 46 } 47 48 int main(){ 49 cin>>a>>b>>c>>d; 50 findAns(); 51 findAns2(); 52 return 0; 53 }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 内存占用高分析
· .NET Core GC计划阶段(plan_phase)底层原理浅谈
· .NET开发智能桌面机器人:用.NET IoT库编写驱动控制两个屏幕
· 用纯.NET开发并制作一个智能桌面机器人:从.NET IoT入门开始
· 一个超经典 WinForm,WPF 卡死问题的终极反思
· 支付宝事故这事儿,凭什么又是程序员背锅?有没有可能是这样的...
· 在线客服系统 QPS 突破 240/秒,连接数突破 4000,日请求数接近1000万次,.NET 多
· C# 开发工具Visual Studio 介绍
· 在 Windows 10 上实现免密码 SSH 登录
· C#中如何使用异步编程