AcWing 883. 高斯消元解线性方程组
原题链接
简单
作者:
gongjin
,
2023-01-10 14:28:26
,
所有人可见
,
阅读 127
高斯消元 JAVA实现
import java.util.Scanner;
class Main {
static int n;
static double[][] a;
static double eps = 1e-6;
public static int gauss() {
int c, r;
for (c = 0, r = 0; c < n; c++) {
int t = r;
//寻找最大的系数
for (int i = r; i < n; i++) {
if (Math.abs(a[i][c]) > Math.abs(a[t][c])) {
t = i;
}
}
//最大的系数是0,方程不够n个数了,不是完美阶梯矩阵
if (Math.abs(a[t][c]) < eps) continue;
//把系数最大的换到最上面
for (int i = c; i <= n; i++) {
double tmp = a[t][i];
a[t][i] = a[r][i];
a[r][i] = tmp;
}
//系数变为1
for (int i = n; i >= c; i--) a[r][i] /= a[r][c];
//消元 应该是数着晓得
for (int i = r + 1; i < n; i++) {
if (Math.abs(a[i][c]) > eps) {
for (int j = n; j >= c; j--) {
//减去自己的倍数
a[i][j] = a[i][j] - a[r][j] * a[i][c];
}
}
}
r++;//用来判断解的个数,不能放在for循环里
}
if (r < n) {
for (int i = r; i < n; i++) {
if (Math.abs(a[i][n]) > 0) return 2; //无解 0=!0
}
return 1;//无穷多解 某个系数是0
}
//解完美阶梯矩阵
for (int i = n - 1; i >= 0; i--) {
for (int j = i + 1; j < n; j++) {
a[i][n] -= a[j][n] * a[i][j];
}
}
return 0;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
n = scanner.nextInt();
a = new double[n][n + 1];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n + 1; j++) {
a[i][j] = scanner.nextDouble();
}
}
int t = gauss();
if (t == 0) {
for (int i = 0; i < n; i++) {
if (Math.abs(a[i][n]) < eps) a[i][n] = 0;
System.out.println(String.format("%.2f", a[i][n]));
}
} else if (t == 1) {
System.out.println("Infinite group solutions");
} else {
System.out.println("No solution");
}
}
}