知识点:
- 二分法:遍历-100到100每一个整数,并判断两个整数带入的值相乘是否符合零点定理,如果符合,则他们之间存在符合方程的解。
- 保留小数点后几位:使用DecimalFormat构造。
- 连续float值相加会形成double值;
代码:
package 算法训练;
import java.text.DecimalFormat;
import java.util.Scanner;
public class 一元三次方程求解 {
static float a,b,c,d;
public static void main(String args[])
{
Scanner sc=new Scanner(System.in);
a=sc.nextFloat();
b=sc.nextFloat();
c=sc.nextFloat();
d=sc.nextFloat();
for(int i=-100;i<=99;i++)
{
float a=(float) (i+1);
if(f(i)==0)//遍历不到100
{
System.out.printf("%.2f ",(float)i);
}
else if(f(i)*f(a)<0)//两个数之间存在解
{
check((float) i,a);//二分计算
}
}
if((int)f(100)==0)
System.out.printf("%.2f ",(float)100);
}
private static void check(float i, float a2) {
float x=i;
float y=a2;
while(Math.abs(x-y)>0.001)//如果小于0.001则跳出循环,确保可以精确到0.01
{
float mid=(x+y)/2;
if(f(x)*f(mid)<0)
y=mid;
else
x=mid;
}
System.out.printf("%.2f ",x);
}
private static float f(float e) {
DecimalFormat df=new DecimalFormat("#.000");//精确到小数点后三位
float z=(float) Math.pow(e,3)*a;
float q=(float) Math.pow(e,2)*b;
float m=(float) (c*e);
return Float.valueOf((df.format(z+q+m+d)));//连续float值相加会形成double值;
}
}