解决此题的关键在于,如何运用二分法来查找目标值(也就是一元三次方程的解)。我们可以将-100100细化,先对-100100的整数进行遍历,如果方程满足f(x)=0,那么x即为方程的解,如在在整数中无法找到解,那么就要在i和i+1的区间中找,这里我们可以运用二分法来查找。i为首指针,i+1为尾指针,mid为中间指针(等于(i+(i+1))/2),如果满足f_left * f_mid < 0,那么将尾指针赋值为mid,不满足则首指针赋值为mid,即可解决此题。

import java.util.*; public class Main {

public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
double A=sc.nextDouble(),B=sc.nextDouble(),C=sc.nextDouble(),D=sc.nextDouble();
for(int i=-100;i<=100;i++) {
	double f_i=A*Math.pow(i, 3)+B*Math.pow(i, 2)+C*i+D;
	
	if(f_i==0) {
		System.out.print(String.format("%.2f",i*1.0));
		System.out.print(" ");
		continue;
	}
	if(f_i * (A*Math.pow(i+1, 3)+B*Math.pow(i+1, 2)+C*(i+1)+D) < 0) {
		double left=i;
		double right=i+1;
		while(left<=right-0.001) {
			double mid=(left+right)/2;
			double f_left=A*Math.pow(left, 3)+B*Math.pow(left, 2)+C*left+D;
			double f_right=A*Math.pow(right, 3)+B*Math.pow(right, 2)+C*right+D;
			double f_mid=A*Math.pow(mid, 3)+B*Math.pow(mid, 2)+C*mid+D;
			if(f_left * f_mid < 0) {
				right=mid;
			}
			if(f_left * f_mid >= 0) {
				left=mid;
			}
		}
		 System.out.printf("%.2f ",left);
	}
	
	
}



	
}

}