java基础 --- 求一元二次方程的根(分情况讨论)

01. 目的

求一元二次方程 a x 2 + b x + c = 0 ax^2+bx+c=0 ax2+bx+c=0 的根,分情况讨论,结果保留2位小数。

02. 一元二次方程 a x 2 + b x + c = 0 ax^2+bx+c=0 ax2+bx+c=0 的根

由代数基本定理,一元二次方程有且仅有两个根(重根按重数计算): x = − b ± b 2 − 4 a c 2 a x = \dfrac{-b \pm \sqrt{b^2 - 4ac}}{2a} x=2ab±b24ac 根的情况由判别式 b 2 − 4 a c \sqrt{b^2 - 4ac} b24ac 决定 ,利用一元二次方程根的判别式 b 2 − 4 a c \sqrt{b^2 - 4ac} b24ac 可以判断方程的根的情况。

一元二次方程 的根与根的判别式 有如下关系:

①当 b 2 − 4 a c > 0 \sqrt{b^2 - 4ac}> 0 b24ac >0 时,方程有两个不相等的实数根;
②当 b 2 − 4 a c = 0 \sqrt{b^2 - 4ac}=0 b24ac =0时,方程有两个相等的实数根;
③当 b 2 − 4 a c &lt; 0 \sqrt{b^2 - 4ac}&lt; 0 b24ac <0 时,方程无实数根,但有2个共轭复根。

上述结论反过来也成立。

方程的形式与系数a、b、c的关系
① 如果系数a、b、c都为0,则输出“方程不存在!";
② 如果a和b为0,c不为0,此时c=0不是方程,输出"方程不存在!";
③ 如果当a为0,且b、c不为0时,方程变为一元一次方程bx+c=0,此时方程
只有一个解;
④根据判别式确定方程的解。

###03. 求根代码

package com.test;//创建一个test包

import java.util.Scanner;//导入java.util包中的Scanner类(使用此类可以方便的完成输入流的输入操作)
import java.math.BigDecimal;//导入java.math包中的BigDecimal(用来对超过	16位有效位的数进行精确的运算)

//对一元二次方程中各系数的不同情况作讨论,列出不同情况下根的分布,最终求出存在的根
public class Squ { //定义一个公共类---Squ
	public static void main(String[]args)
	{   
		double X1,X2;//定义临时变量X1,X2;
		System.out.println("方程表达式为:ax2+bx+c=0");//显示台输出---方程表达式为:ax2+bx+c=0
		@SuppressWarnings("resource")
		Scanner sc=new Scanner(System.in);//用Scanner类获取控制台的输入(即获得从键盘输入的数)
		System.out.println("请输入a的值:");//显示台输出提示---输入a的值
		//每一次从键盘输入值后回车执行后面的内容
		double a=sc.nextDouble();//接受控制台输入的数字给形参a赋值
		System.out.println("请输入b的值:");//显示台输出提示---输入b的值
		double b=sc.nextDouble();//接受控制台输入的数字给形参b赋值
		System.out.println("请输入c的值:");//显示台输出提示---输入c的值
		double c=sc.nextDouble();//接受控制台输入的数字给形参c赋值
		double t=b*b-4*a*c;//定义一个变量t,且t=b*b-4*a*c,此时t为方程根的判别式
		
		//用判断语句对方程的系数的不同情况作讨论,并得出根的分布情况
		//① 判断当a、b、c都为0时,方程变为等式0=0;方程不存在!
		if(a==0 && b==0 && c==0)
		{
			System.out.println("方程不存在!");//显示台输出
		}
		//② 当a、b都为0,而c不为0时,方程变为等式c=0,此中不含未知数,方程不存在!
		else if(a==0 && b==0 && c!=0)
		{
			System.out.println("方程不存在!");//显示台输出
		}
		//③ 当a为0,且b、c不为0时,方程变为一元一次方程bx+c=0,此时方程只有一个解
		else if(a==0 && b!=0 && c!=0)
		{
			System.out.println("此方程为一元一次方程");//显示台输出
			double result = (-1 * c) / b;//定义一个变量result存放方程的解;此时解为:-c/b
			System.out.println(resetValue(result)+"方程的解为:");
		}
		//④ 以上定义了t=b*b-4*a*c,若t>0,则t的开方为实数,此时方程有两个不同的实根,且两实根为相反数
		else if(t>0)
		{
			System.out.println("方程有两个实根");//显示台输出
			//第一根的算法:((-b) + Math.sqrt(t)) / 2 * a( Math.sqrt是指math方法中的sqrt类,即开方)
			X1= ((-b) + Math.sqrt(t)) / 2 * a;
			//第一根的算法:((-b) - Math.sqrt(t)) / 2 * a
			X2= ((-b) - Math.sqrt(t)) / 2 * a;
			//显示台输出两根的值
			System.out.println("X1="+resetValue(X1));
			System.out.println("X2="+resetValue(X2));
		}
		//⑤ 如果t<0,则t开方后产生虚数,此时方程有一对共轭副根
		else if(t<0)
		{
			double X4,X5;//定义临时变量X4、X5
			//⑥ 如果b不等于0,则其根为共轭副根,根由虚部和实部组成
			if(b!=0)
			{
				X4=(-1*b)/(2*a);//根的实部
				X5=Math.sqrt(-1*t)/(2*a);//根的虚部
				System.out.println("方程有一对共轭副根:");//显示台输出
				//输出时toString()表示用科学计数法输出根的值;加i指虚部的表示法;其中的"+、-"连接根的实部和虚部,形成共轭
				System.out.println("X1="+resetValue(X4).toString()+"+"
						+resetValue(X5).toString()+"i");//输出第一个根的值
				System.out.println("X2="+resetValue(X4).toString() + "-"
						+ resetValue(X5).toString() + "i");//输出第二个根的值
			}
			//⑦ 若b=0,则此时根只有虚部没有实部,是一对共轭副根,实部为0
			else
			{
				double X6=Math.sqrt(-1*t)/(2*a);//根中只有虚部
				System.out.println("方程有一对相反虚根:");//显示台输出
				//输出时toString()表示用科学计数法输出根的值;加i指虚部的表示法;其中的"+、-"连接根的实部和虚部,形成共轭,此时实部为0
				System.out.println("X1=0-"+resetValue(X6).toString()+"i");
				System.out.println("X2=0+"+resetValue(X6).toString()+"i");
				
			}
		}
		//⑧ 若t=0,则方程有一个实根
		else if(t==0)
			{
				double X3=(-1*b)/2*a;//根的计算
				System.out.println("方程有一个实根");//显示台输出
				System.out.println("方程的解为:"+resetValue(X3));//显示台输出方程的解
			}
			
		}
		
	//使用静态方法将定义的值由double类型转换为BigDecimal类型(声明)
	private static BigDecimal resetValue(double n) {
		// TODO 自动生成的方法存根
		BigDecimal bd=new BigDecimal(n);//将n的值赋给形参bd
		//返回的值保留两位小数,默认用四舍五入方式 (ROUND_HALF_UP表示遇5进1;setScale规定要保留的小数位数)
		return bd.setScale(2,BigDecimal.ROUND_HALF_UP);
	}

}

###04. 运行结果
这里写图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值