编程求解一元二次方程ax^2 + bx + c = 0的根,要求a、b、c从键盘输入。
要求Main类中必须有如下方法:
public static void main(String[] args);//主方法
public static int solveQuadratic(double[] eqn, double[] roots);//eqn存储输入的三个系数a、b、c,然后将两个实数根存储进roots中,该方法返回实数根的个数。
输入格式:
从键盘输入一元二次方程的三个系数的值(均为实型数),可以用一个或多个空格或回车分隔。
输出格式:
- 当输入数据非法时,输出“Wrong Format”
- 当无实数根时,输出如下字符串“The equation has no roots”;
- 当只有一个根时,输出如下格式“The equation has one root: 值”;(注意,输出的值必须保留四位小数,且值前面有一个空格)
- 当有两个根时,输入如下格式“The equation has two roots: 值1 and 值2”;(注意,输出的值必须保留四位小数,且值前面均有一个空格)
输入样例1:
2 6 -554
输出样例1:
The equation has two roots: 15.2108 and -18.2108
输入样例2:
300.0 0.0 0.00
输出样例2:
The equation has one root: 0.0000
/*从键盘输入一元二次方程的三个系数的值(均为实型数),可以用一个或多个空格或回车分隔。
当输入数据非法时,输出“Wrong Format”
当无实数根时,输出如下字符串“The equation has no roots”;
当只有一个根时,输出如下格式“The equation has one root: 值”;(注意,输出的值必须保留四位小数,且值前面有一个空格)
当有两个根时,输入如下格式“The equation has two roots: 值1 and 值2”;(注意,输出的值必须保留四位小数,且值前面均有一个空格)*/
import java.util.*;
public class Main{
public static void main(String[] args)//主方法
{
Scanner in = new Scanner(System.in);
double[] eqn = new double[3];
double[] roots = new double [2];
int cnt=0;
int i;
for(i=0;i<3;i++){
if(!(in.hasNextDouble())){
System.out.println("Wrong Format");//判断是否是实型
System.exit(0);
}else{
eqn[i]=in.nextDouble();
if(eqn[0]==0){
System.out.println("Wrong Format");//判断是否是一元二次方程,即a不能为0
System.exit(0);
}
}
}
cnt=solveQuadratic(eqn,roots);
if(cnt==0){
System.out.println("The equation has no roots");
}else if(cnt==1){
System.out.printf("The equation has one root: %.4f",roots[0]);
}else if(cnt==2){
System.out.printf("The equation has two roots: %.4f and %.4f",roots[0],roots[1]);
}
}
static int solveQuadratic(double[] eqn, double[] roots)//eqn存储输入的三个系数a、b、c,然后将两个实数根存储进roots中,该方法返回实数根的个数。
{
double sq;
double dt=eqn[1]*eqn[1]-4*eqn[0]*eqn[2];
if(dt<0){
return 0;
}else if(dt==0){
roots[0]=(-eqn[1])/(2*eqn[0]);
if(roots[0]==0)roots[0]=0;
return 1;
}else if(dt>0){
sq=Math.sqrt(dt);
roots[0]=((-eqn[1])+sq)/(2*eqn[0]);
roots[1]=((-eqn[1])-sq)/(2*eqn[0]);
return 2;
}
return 0;
}
}