/*
高斯消元
时间复杂度:O(N ^ 3)
*/
#include <bits/stdc++.h>
using namespace std;
const double eps = 1e-10;
int n;
double a[101][101], b[101];
inline void gauss(){
int l = 1;
for(int i = 1; i <= n; i ++ ){
for(int j = l + 1; j <= n; j ++ ){
for(int k = i; k <= n; k ++ ){
swap(a[j][k], a[l][k]);
}
swap(b[j], b[l]);
}
if(abs(a[l][i]) < eps) continue;
for(int j = 1; j <= n; j ++ )
if(j != l && abs(a[j][i]) >= eps){
double delta = a[j][i] / a[l][i];
for(int k = i; k <= n; k ++ ){
a[j][k] -= a[l][k] * delta;
}
b[j] -= b[l] * delta;
}
l ++;
}
for(int i = l; i <= n; i ++ ){//无解
if(abs(b[i]) >= eps){
puts("-1");
return;
}
}
if(l <= n){//无穷多解
puts("-2");
return;
}
for(int i = 1; i <= n; i ++ )
printf("%.10lf\n", b[i] / a[i][i]);
}
int main(){
scanf("%d",&n);
for(int i = 1; i <= n; i ++ ){
for(int j = 1; j <= n; j ++ ){
scanf("%lf",&a[i][j]);
}
scanf("%lf",&b[i]);
}
gauss();
return 0;
}
ACM模板高斯消元
于 2022-09-08 14:35:08 首次发布