#include<cstdio>
#include<algorithm>
#include<math.h>
using namespace std;
int ab[215][3];
double ac[21555];
double a, b, c, d;
int IsBlue(double mid, int flag){
double c = a * pow(mid, 3) + b * pow(mid, 2) + c * mid + d;
if(flag == 1){
if(c >= 0) return 1;
else return 0;
}
else if(flag == 0){
if(c <= 0) return 1;
else return 0;
}
return 0;
}
int dw(int l, int r, int flag){
if(flag == 1){
while(l + 1 != r){
int mid = (l + r) / 2;
if(IsBlue(ac[mid], 1)){
l = mid;
}
else r = mid;
}
}
else if(flag == 0){
while(l + 1 != r){
int mid = (l + r) / 2;
if(IsBlue(ac[mid], 0)){
l = mid;
}
else r = mid;
}
}
return l;
}
int main(){
int j = 0;
scanf("%lf %lf %lf %lf",&a, &b, &c, &d);
for(int i = -100; i <= 100; i++){
double q = a * pow(i, 3) + b * pow(i, 2) + c * i + d;
double p = 0;
if(i != 100){
p = a * pow(i + 1, 3) + b * pow(i + 1, 2) + c * (i + 1) + d;
}
if(q == 0) printf("%d.00 ",i);
else if(q > 0&& p < 0){
ab[++j][1] = i;ab[j][2] = 1; ab[++j][1] = i + 1;
}
else if(q < 0&& p > 0){
ab[++j][1] = i; ab[j][2] = 0; ab[++j][1] = i + 1;
}
}
for(int i = 1; i <= j; i += 2){
int q = 0;
for(double k = ab[i][1]; k <= ab[i + 1][1]; k += 0.0001){
ac[++q] = k;
}
int ans = dw(0, q + 1, ab[i][2]);
printf("%.2f ",ac[ans]);
}
putchar('\n');
return 0;
}
我是先找到函数值相乘小于0的两个根,然后用二分法保持精度在0.0001.