AcWing 883. 高斯消元解线性方程组——java
原题链接
简单
作者:
大猩猩吃月亮
,
2025-04-01 15:02:44
· 河北
,
所有人可见
,
阅读 1
import java.util.*;
import java.io.*;
public class Main {
static final int N = 110;
static double[][] g = new double[N][N];
static int n;
static double esp = 1e-8;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = Integer.parseInt(br.readLine());
for(int i = 0; i < n; i++) {
String[] s = br.readLine().split(" ");
for(int j = 0; j < n + 1; j++) {
g[i][j] = Double.valueOf(s[j]);
}
}
int t = gauss();
if(t == 0) {
for(int i = 0; i < n; i++) {
System.out.println(String.format("%.2f", g[i][n]));
}
}else if(t == 1) {
System.out.println("Infinite group solutions");
}else {
System.out.println("No solution");
}
}
public static void swap(int x1, int y1, int x2, int y2) {
double t = g[x1][y1];
g[x1][y1] = g[x2][y2];
g[x2][y2] = t;
}
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(g[i][c]) > Math.abs(g[t][c])) {
t = i;
}
}
if(Math.abs(g[t][c]) < esp) continue;
for(int i = c; i < n + 1; i++) swap(r, i, t, i);
for(int i = n; i >= c; i--) g[r][i] /= g[r][c];
for(int i = r + 1; i < n; i++) {
if(Math.abs(g[i][c]) > esp) {
for(int j = n; j >= c; j--) {
g[i][j] -= g[i][c] * g[r][j];
}
}
}
r++;
}
if(r < n) {
for(int i = r; i < n; i++) {
if(Math.abs(g[i][n]) > esp) {
return 2;
}
}
return 1;
}
for(int i = n - 1; i >= 0; i--) {
for(int j = i + 1; j < n; j++) {
g[i][n] -= g[i][j] * g[j][n];
}
}
return 0;
}
}