一元三次方程求解

总时间限制:
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
来源
NOIP2001复赛 提高组 第一题
1 #include<bits/stdc++.h> 2 using namespace std; 3 const double eps=0.0001; 4 double a,b,c,d; 5 inline double calc(double x){ 6     double h=a*x*x*x+b*x*x+c*x+d; 7     return h; 8 } 9 double ans[5];10 inline void find(double,double);11 int sum;12 int main(){13     scanf("%lf%lf%lf%lf",&a,&b,&c,&d);14     for(int i=-101;i<=101;i++){15         double tmp1=calc((double)i);16         double tmp2=calc(double(i+1));17         if(tmp1==0){18             ans[++sum]=(double)i;19         } 20         else if(tmp2==0){21             ans[++sum]=(double)(i+1);22             i++;23         } 24         else if(tmp1*tmp2<0){25             find((double)i,(double)i+1);26         }27         if(sum==3){28             printf("%.2lf %.2lf %.2lf",ans[1],ans[2],ans[3]);29             return 0;30         }31     }32     33     return 0;34 }35 inline void find(double l,double r){36     if(r-l<=eps){37         ans[++sum]=(l+r)/(double)2;38         return ;39     }40     double mid=(l+r)/(double)2;41     double tmp=calc(mid);42     double tmpl=calc(l); 43     double tmpr=calc(r);44     if(tmp==0){45         ans[++sum]=tmp;46         return ;47     }48     else if(tmp*tmpl<0){49         find(l,mid);50     }51     else if(tmp*tmpr<0){52         find(mid,r);53     }54 }

原文链接: https://www.cnblogs.com/CXCXCXC/p/4903288.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/223559

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月13日 下午12:06
下一篇 2023年2月13日 下午12:07

相关推荐