首先輸入行列式的階數,然后以輸入行列式內容。
例如:
輸入:
4
1 2 -1 3
2 3 -1 2
-1 1 1 0
0 1 -2 1
輸入:
18.0
好像是高斯消元,就是每一行乘一個系數減下去,化三角。
時間復雜度 O(n^3) .
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;
}
}
}
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。