计算行列式(高斯消元?+Java+工具)

功能:


计算行列式并输出

用法:


首先输入行列式的阶数,然后以输入行列式内容。

例如:

输入:
4
1 2 -1 3
2 3 -1 2
-1 1 1 0
0 1 -2 1

输入:
18.0

实现:


好像是高斯消元,就是每一行乘一个系数减下去,化三角。
时间复杂度 O(n^3) .

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
import java.util.*;
import java.lang.*;

public class Determinant {

public static void main(String[] Args){
Scanner cin = new Scanner(System.in);
int size = cin.nextInt();
double[][] data = new double[size][size];

//读取数据
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++) {
data[i][j] = cin.nextDouble();
}
}

//标记是否可以提前确定行列式为0
boolean zero = false;
//记录交换行后的正负号
double sign = 1;

//主体
for (int row = 0; row < size-1; row++){

//如果第i行第i个元素已经是0的话,就去找一行非零的行交换
if (data[row][row] == 0) {
boolean flag = false;
for (int trow = row + 1; trow < size; trow++){
if (data[trow][row] != 0){
flag = true;
swap_row(row, trow, size, data);
sign *= -1;
break;
}
}
//如果一列全为0,那么行列式为0
if (!flag)
{
zero = true;
break;
}
}

for (int trow = row + 1; trow < size; trow++){
double k;
//如果当前行已经为0,那么直接跳过,否则用row行乘-k加到trow行
if (data[trow][row] == 0)
continue;
k = data[trow][row] / data[row][row];
for (int col = row; col < size; col++){
data[trow][col] += -k * data[row][col];
}
}
}

double ans;


//整理答案并输出
if (zero)
ans = 0;
else{
ans = sign;
for (int row = 0; row < size; row++){
ans *= data[row][row];
}
}

System.out.print(ans);
}

static void swap_row(int a, int b, int size, double data[][]){
for (int i = a; i < size; i++){
double temp = data[a][i];
data[a][i] = data[b][i];
data[b][i] = temp;
}
}
}