注意每次选择当前列绝对值最大元素去消除其他的行是误差尽可能的小,
本题特有的性质是,bi全都大于0,所以如果出现对角线上为0的情况是不合理的 0x = bi
#include<bits/stdc++.h> using namespace std; #define eps 1e-8 #define maxn 123 double A[maxn][maxn]; int n,tp; int main() { scanf("%d",&n); for(int i=0; i<n; i++) for(int j=0; j<=n; j++) scanf("%lf",&A[i][j]); for(int i=0; i<n; i++) { tp=i; for(int j=i; j<n; j++) if(fabs(A[j][i])-fabs(A[tp][i])>eps)tp=j; if(tp!=i) for(int j=0; j<=n; j++) swap(A[i][j],A[tp][j]); if(fabs(A[i][i])<=eps) { printf("No Solution "); return 0; } for(int j=i+1; j<=n; j++) A[i][j]/=A[i][i]; for(int j=0; j<n; j++) if(i!=j) for(int k=i+1; k<=n; k++) A[j][k]-=A[j][i]*A[i][k]; } for(int i=0; i<n; i++)printf("%.2lf ",A[i][n]); return 0; }