#include<iostream>
#include<cmath>
#include<iomanip>
using namespace std;
double fx(double nparam[3],double x)
{
<span style="white-space:pre"> </span> return pow(x,3)+nparam[0]*pow(x,2)+nparam[1]*x+nparam[2];
}
int oneresult(double nparam[3],double nrange[2],double via,int position)
{
<span style="white-space:pre"> </span> double i=via;
<span style="white-space:pre"> </span> nrange[0]=via;
<span style="white-space:pre"> </span> if(position==0)
<span style="white-space:pre"> </span> {
<span style="white-space:pre"> </span> while(fx(nparam,i)*fx(nparam,via)>0)
<span style="white-space:pre"> </span> {
<span style="white-space:pre"> </span> if(i>-10)
<span style="white-space:pre"> </span> i=i-0.1;
<span style="white-space:pre"> </span> else
<span style="white-space:pre"> </span> i=i-1;
<span style="white-space:pre"> </span> if(i<-100)
<span style="white-space:pre"> </span> return 1;
<span style="white-space:pre"> </span> }
<span style="white-space:pre"> </span> nrange[1]=i;
<span style="white-space:pre"> </span> }
<span style="white-space:pre"> </span> else
<span style="white-space:pre"> </span> {
<span style="white-space:pre"> </span> while(fx(nparam,i)*fx(nparam,via)>0)
<span style="white-space:pre"> </span> {
<span style="white-space:pre"> </span> if(i<10)
<span style="white-space:pre"> </span> i=i+0.1;
<span style="white-space:pre"> </span> else
<span style="white-space:pre"> </span> i=i+1;
<span style="white-space:pre"> </span> if(i>100)
<span style="white-space:pre"> </span> return 1;
<span style="white-space:pre"> </span> }
<span style="white-space:pre"> </span> nrange[1]=i;
<span style="white-space:pre"> </span> }
<span style="white-space:pre"> </span> return 0;
}
double dichotomy(double nparam[3],double x1,double x2)
{
<span style="white-space:pre"> </span> double x0;
<span style="white-space:pre"> </span> double x3;
<span style="white-space:pre"> </span> while(x0=(x1+x2)/2,(x3=fabs(fx(nparam,x0)))>1e-5)
<span style="white-space:pre"> </span> {
<span style="white-space:pre"> </span> if(fx(nparam,x0)*fx(nparam,x2)>0)
<span style="white-space:pre"> </span> x2=x0;
<span style="white-space:pre"> </span> else
<span style="white-space:pre"> </span> x1=x0;
<span style="white-space:pre"> </span> }
<span style="white-space:pre"> </span> return x0;
}
int Imagequation(double x1,double *p1,double *p2,double *r,double *i)//根据求出来的一个跟,利用待定系数法分解因式,求出两个虚数解
{
<span style="white-space:pre"> </span> *p1+=x1;
<span style="white-space:pre"> </span> *p2+=x1*(*p1);
<span style="white-space:pre"> </span> *r=-(*p1)/2;
<span style="white-space:pre"> </span> *i=sqrt(4*(*p2)-pow(*p1,2))/2;
<span style="white-space:pre"> </span> return 1;
}
int main()
{
<span style="white-space:pre"> </span> double param[3];
<span style="white-space:pre"> </span> double dparam[3];
<span style="white-space:pre"> </span> double range[2];
<span style="white-space:pre"> </span> double result[3];
<span style="white-space:pre"> </span> double x1,x2;
<span style="white-space:pre"> </span> double a,b,c,d;
<span style="white-space:pre"> </span> int i=0;
<span style="white-space:pre"> </span> cout<<"请输入一元三次方程的四个参数A,B,C,D"<<endl;
<span style="white-space:pre"> </span> cin>>a>>b>>c>>d;
<span style="white-space:pre"> </span> if(a==0)
<span style="white-space:pre"> </span> {
<span style="white-space:pre"> </span> cout<<"您数的参数有误!!!"<<endl;
<span style="white-space:pre"> </span> return 1;
<span style="white-space:pre"> </span> }
<span style="white-space:pre"> </span> param[0]=b/a;
<span style="white-space:pre"> </span> param[1]=c/a;
<span style="white-space:pre"> </span> param[2]=d/a;
<span style="white-space:pre"> </span> dparam[0]=3;
<span style="white-space:pre"> </span> dparam[1]=2*param[0];
<span style="white-space:pre"> </span> dparam[2]=param[1];
<span style="white-space:pre"> </span> if(dparam[1]*dparam[1]-4*dparam[2]*dparam[0]<0)//单调递增的,只有一个实数解
<span style="white-space:pre"> </span> {
<span style="white-space:pre"> </span> if(1==oneresult(param,range,0,1)&&1==oneresult(param,range,0,0))
<span style="white-space:pre"> </span> {
<span style="white-space:pre"> </span> cout<<"无法求解!!!"<<endl;
<span style="white-space:pre"> </span> return 1;
<span style="white-space:pre"> </span> }
<span style="white-space:pre"> </span> else
<span style="white-space:pre"> </span> {
<span style="white-space:pre"> </span> if(1==oneresult(param,range,0,1))
<span style="white-space:pre"> </span> oneresult(param,range,0,0);
<span style="white-space:pre"> </span> result[0]=dichotomy(param,range[0],range[1]);
<span style="white-space:pre"> </span> cout<<"xx只有一个实数解!!!"<<endl;
<span style="white-space:pre"> </span> cout<<"x1="<<result[0]<<endl;
<span style="white-space:pre"> </span> Imagequation(result[0],¶m[0],¶m[1],&result[1],&result[2]);
<span style="white-space:pre"> </span> cout<<"xx有两个虚数解!!!"<<endl;
<span style="white-space:pre"> </span> cout<<"x2="<<result[1]<<"+"<<result[2]<<"i"<<endl;
<span style="white-space:pre"> </span> cout<<"x3="<<result[1]<<"-"<<result[2]<<"i"<<endl;
<span style="white-space:pre"> </span> }
<span style="white-space:pre"> </span> }
<span style="white-space:pre"> </span> else
<span style="white-space:pre"> </span> {
<span style="white-space:pre"> </span> x1=(-dparam[1]+sqrt(dparam[1]*dparam[1]-4*dparam[2]*dparam[0]))/(2*dparam[0]);
<span style="white-space:pre"> </span> x2=(-dparam[1]-sqrt(dparam[1]*dparam[1]-4*dparam[2]*dparam[0]))/(2*dparam[0]);
<span style="white-space:pre"> </span> if(fx(param,x2)*fx(param,x1)<=0)//极大值和极小值处函数值符号相反,则肯定有三个实数解
<span style="white-space:pre"> </span> {
<span style="white-space:pre"> </span> cout<<"有三个实数解!!!"<<endl;
<span style="white-space:pre"> </span> oneresult(param,range,x2,0);
<span style="white-space:pre"> </span> result[0]=dichotomy(param,range[0],range[1]);
<span style="white-space:pre"> </span> oneresult(param,range,x1,1);
<span style="white-space:pre"> </span> result[1]=dichotomy(param,range[0],range[1]);
<span style="white-space:pre"> </span> result[2]=dichotomy(param,x2,x1);
<span style="white-space:pre"> </span> cout.setf(ios::fixed);
<span style="white-space:pre"> </span> cout<<setprecision(6)<<"x1="<<result[0]<<endl;
<span style="white-space:pre"> </span> cout<<setprecision(6)<<"x2="<<result[1]<<endl;
<span style="white-space:pre"> </span> cout<<setprecision(6)<<"x3="<<result[2]<<endl;
<span style="white-space:pre"> </span> }
<span style="white-space:pre"> </span> else//极大值和极小值处函数值符号相同,则肯定只有有一个实数解,两个虚数解
<span style="white-space:pre"> </span> {
<span style="white-space:pre"> </span> cout<<"只有一个实数解!!!"<<endl;
<span style="white-space:pre"> </span> oneresult(param,range,x1,1);
<span style="white-space:pre"> </span> result[0]=dichotomy(param,range[0],range[1]);
<span style="white-space:pre"> </span> cout.setf(ios::fixed);
<span style="white-space:pre"> </span> cout<<setprecision(6)<<"x1="<<result[0]<<endl;
<span style="white-space:pre"> </span> Imagequation(result[0],¶m[0],¶m[1],&result[1],&result[2]);
<span style="white-space:pre"> </span> cout<<"有两个虚数解!!!"<<endl;
<span style="white-space:pre"> </span> cout<<"x2="<<result[1]<<"+"<<result[2]<<"i"<<endl;
<span style="white-space:pre"> </span> cout<<"x3="<<result[1]<<"-"<<result[2]<<"i"<<endl;
<span style="white-space:pre"> </span> } <span style="white-space:pre"> </span>
<span style="white-space:pre"> </span> }
<span style="white-space:pre"> </span> return 0;
}