注意: 用户输入的是字符串,字符串再转化为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名称是可以直接编译的。