Java计算行列式

Java计算行列式

  1. Scanner包获取用户输入这没什么好说的。
  2. javax.script包在本程序中用于调用 eval() 函数,eval() 可以把用户输入的分数转换为小数,实际上eval() 的功能是将用户输入的算式字符串(String)转换为double型小数
  3. 这里我复制了别人的ArithUtil类,作用是可以使double型的四则运算算的更精确。
  4. 然后我计算行列式的思路是降阶法eg: 把4阶化成3阶行列式,然后再把3阶化成2阶行列式,2阶行列式很好算,就是a[0][0]*a[1][1]-a[0][1]*a[1][0]。

注意: 用户输入的是字符串,字符串再转化为double型小数;用户需要一个一个的输入行列式的每个值,输入完一个按回车这样子,有人说这样输入太麻烦了,但是我没有上网查怎么样输入一行用空格隔开的数(偷个懒,嘻嘻)。
另外,ArrayCount这个类开头的 static final int MAX_RANK=10; 意思是最大可以算多少阶的行列式。

package 行列式;

import java.math.*;
import java.util.Scanner;
import javax.script.*;///java调用js的头文件

class ArithUtil{  
    private static final int DEF_DIV_SCALE=10;  
      
    private ArithUtil(){}  
    //精确的加法算法
    public static double add(double d1,double d2){  
        BigDecimal b1=new BigDecimal(Double.toString(d1));  
        BigDecimal b2=new BigDecimal(Double.toString(d2));  
        return b1.add(b2).doubleValue();  
          
    }  
    //精确的减法算法  
    public static double sub(double d1,double d2){  
        BigDecimal b1=new BigDecimal(Double.toString(d1));  
        BigDecimal b2=new BigDecimal(Double.toString(d2));  
        return b1.subtract(b2).doubleValue();  
          
    }  
    //精确的乘法算法  
    public static double mul(double d1,double d2){  
        BigDecimal b1=new BigDecimal(Double.toString(d1));  
        BigDecimal b2=new BigDecimal(Double.toString(d2));  
        return b1.multiply(b2).doubleValue();  
          
    }  
    //相对精确的除法运算,当发生除不尽的情况时,精确到小数点以后10位  
    public static double div(double d1,double d2){  
  
        return div(d1,d2,DEF_DIV_SCALE);  
          
    }  
    //相对精确的除法运算,当发生除不尽的情况时,精确到小数点以后指定精度(scale),再往后的数字四舍五入
    public static double div(double d1,double d2,int scale){  
        if(scale<0){  
            throw new IllegalArgumentException("The scale must be a positive integer or zero");  
        }  
        BigDecimal b1=new BigDecimal(Double.toString(d1));  
        BigDecimal b2=new BigDecimal(Double.toString(d2));  
        return b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();  
          
    }  
      
}  
public class ArrayCount {
static final int MAX_RANK=10;///MAX_RANK代表最大计算多少阶的矩阵
static double[][] a=new double[MAX_RANK][MAX_RANK]; 
	public static void main(String[] args) {
		System.out.println(Array());
	}
static int N;
static double Array()
{
	System.out.println("请输入行列式的阶数:");
	Scanner in=new Scanner(System.in);
	int n=in.nextInt();
	N=n;
	System.out.println("请输入行列式:");
	for(int i=0;i<Math.pow(n,2);i++)
	{
		in=new Scanner(System.in);
		String t=in.nextLine();
		double d;
		if(t.contains("/"))//如果用户输入的值里面有"/",就说明用户输入了一个分数,就用eval()转换为double小数
			a[i/n][i%n]=eval(t);
		else
		{
			d=Double.parseDouble(t);//用户输入的字符串里面没有"/",就用parseDouble()把字符串直接转换为double型
			a[i/n][i%n]=d;
		}
	}
	in.close();
	print();//用于显示行列式,只是为能更加看得清楚
	int t=1;
	while(n>2)
	{
		double p;
		double temp;
		int k;
		for(int i=0;i<n-1;i++)   ///此循环用于把行列式降阶,直到阶数为二
		{
			if(a[n-1][n-1]==0)		///判断a[n-1][n-1]元素是否为零
			{
				for(k=0;k<n-1;k++)   ///如果a[n-1][n-1]等于0,那么就用最底下元素不为零的那一列的替换现在的最后一列,而且t乘-1
				{
					if(a[n-1][k]!=0)
					{ 
						for(int j=0;j<n;j++)
						{
							temp=a[j][k];
							a[j][k]=a[j][n-1];
							a[j][n-1]=temp;
						}
						t*=-1;
						break;		///替换完跳出循环
					}
				} ///
			}
			p=-1*ArithUtil.div(a[n-1][i],a[n-1][n-1]);
			for(int j=0;j<n;j++)
			{
				a[j][i]=ArithUtil.add(a[j][i],ArithUtil.mul(a[j][n-1],p));
			}
		}
		t*=a[n-1][n-1];
		n--;
	}
		return a[0][0]*a[1][1]-a[0][1]*a[1][0]==0?a[0][0]*a[1][1]-a[0][1]*a[1][0]:t*(a[0][0]*a[1][1]-a[0][1]*a[1][0]);
}
static void print()
{
	System.out.println();
	for(int i=0;i<N;i++)
	{
		for(int j=0;j<N;j++)
		{
			if(j!=0)
				System.out.printf("%6.2f",a[i][j]);
			else
				System.out.printf("%5.2f",a[i][j]);
		}
		System.out.println();
		System.out.println();
	}
}
public static Double eval(String str) {

    ScriptEngineManager manager = new ScriptEngineManager();
    ScriptEngine se = manager.getEngineByName("js");
	    Double result = 0.0;

	    try {
	        result = (Double) se.eval(str);
	    } catch (ScriptException e) {
	        e.printStackTrace();
	    }
	    return result;
	}
	 

}


代码复制了改一下package名称和class名称是可以直接编译的。

你可能感兴趣的:(Java计算行列式)