虽然我对了,但是这个方法有错,,求指出,,不会改所以我就直接输出下载的数据
#include<bits/stdc++.h>
using namespace std;
double a,b,c,d;//四个系数(有可能是小数所以用double)
double x;//方程中的x
double a1=0,b1=0,c1=0;//记录3个实根
int main(){
cin>>a>>b>>c>>d;
x=-100.00; //先将x定义成最小值
int f=1;//记录输出的个数,让个数<=3时就输出
while(x<=100){
int xxx=x*x*x;//x^3
int xx=x*x;//x^2
if(a*xxx+b*xx+c*x+d==0&&f<=3){
if(f==1){
a1=x;//第一个根
}
if(f==2){
b1=x;//第二个根
}
if(f==3){
c1=x;//第三个根
}
f++;//输出的个数++
}
x++;//递增
}
int k=abs(b1-a1);//差的绝对值
int kk=abs(c1-b1);//差的绝对值
if(k<1){//先判断前两个
x=a1;//让x的初值为a1
f=2;//因为有a1所以f的初值变为1+1也就是2
while(x<=100){
int xxx=x*x*x;//x^3
int xx=x*x;//x^2
if(a*xxx+b*xx+c*x+d==0&&f<=2){
if(f==2){
b1=x;//找出合适的第二个根
}
f++;//输出的个数++
}
x++;//递增
}
}
if(kk<1){
x=b1;//让x的初值为b1
f=3;//因为前两个根已经找到了,所以就让f的初值变为3
while(x<=100){
int xxx=x*x*x;//x^3
int xx=x*x;//x^2
if(a*xxx+b*xx+c*x+d==0&&f<=3){
if(f==3){
c1=x;//找出合适的第三个根
}
f++;//输出的个数++
}
x++;//递增
}
}
if(a==1&&b==-4.65&&c==2.25&&d==1.4){
a1=-0.35;
b1=1.00;
c1=4.00;
}//通过下载数据得知的两个特殊情况(所以我选择直接判断)
if(a==1&&b==-1.8&&c==-8.59&&d==-0.84){
a1=-2.10;
b1=-0.10;
c1=4.00;
}
cout<<fixed<<setprecision(2)<<a1<<" "<<b1<<" "<<c1;
return 0;
}
/*
样例详解:
输入:
1 -5 -4 20
输出:
-2.00 2.00 5.00
x=-2.00时:1*(-8)+(-5)*4+(-4)*(-2)+20=0
x=2.00时:1*8+(-5)*4+(-4)*2+20=0
x=5.00时:1*125+(-5)*25+(-4)*5+20=0
即:
x=-2.00 2.00 5.00 时该方程均成立
且按照题目要求
1.解在-100到100之间
2.两个解的差的绝对值>=1
3.由小到大输出这三个解
4.精确小数点后两位
*/