超级难
#include <iostream>
#include <cmath>
using namespace std;
const int NN = 110;
const double eps = 1e-6; // eps 用来判断浮点数是否为0
double a[NN][NN]; // 系数均用double存下来
int n;
int gauss(){
int r = 1, c = 1;
for (c; c <= n; c ++){
int t = r;
// 找到当前列绝对值最大的数
for (int i = r; i <= n; i ++){
if (abs(a[t][c]) < abs(a[i][c])) t = i;
}
if (abs(a[t][c]) < eps) continue; // 这个判断别忘了
// 交换当前行与最上面的行
for (int j = c; j <= n + 1; j ++) swap(a[t][j], a[r][j]);
// 将最上面一行的a[r][c]变为1
for (int j = n + 1; j >= c; j --) a[r][j] /= a[r][c]; // 注意逆序
// 将c列的所有剩下的数变为0
for (int i = r + 1; i <= n; i ++){
for (int j = n + 1; j >= c; j --){ // 注意要逆序
a[i][j] -= a[i][c] * a[r][j];
}
}
r ++; // 不要忘记了
}
// for (int i = 1; i <= n; i ++){
// for (int j = 1; j <= n + 1; j ++){
// cout << a[i][j] << ' ';
// }cout << endl;
// }
// r 是转换后的未知数的个数
if (r < n + 1){
for (int i = r; i <= n; i ++){
if (a[i][n + 1] > eps) return 0; // 无解
}return 1; // 无穷解
}
for (int i = n; i >= 1; i --){
for (int j = i + 1; j <= n; j ++){
a[i][n + 1] -= a[j][n + 1] * a[i][j]; // 好好理解
}
}
return 2; // 唯一解
}
int main(){
cin >> n;
for (int i = 1; i <= n; i ++){
for (int j = 1; j <= n + 1; j ++){
cin >> a[i][j];
}
}
int t = gauss();
if (t == 2){
for (int i = 1; i <= n; i ++) printf("%.2lf\n", a[i][n + 1]);
}
return 0;
}