题解 | #[NOIP2001]一元三次方程求解#
[NOIP2001]一元三次方程求解
https://ac.nowcoder.com/acm/problem/16694
解决此题的关键在于,如何运用二分法来查找目标值(也就是一元三次方程的解)。我们可以将-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);
}
}
}
}