【高斯消元】CDOJ1783 曜酱的线性代数课堂(一)

高斯消元求逆矩阵板子。

#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
const double EPS=0.00000001;
#define N 105
int n;
double B[N][N*2],A[N][N*2],C[N][N];
bool guass_jordan()
{
    memcpy(B,A,sizeof(A));
    for(int i=1;i<=n;++i){
    	for(int j=n+1;j<=n*2;++j){
    		if(i==j-n){
    			B[i][j]=1.0;
    		}
    		else{
    			B[i][j]=0.0;
    		}
    	}
    }
    for(int i=1;i<=n;++i){
      	int pivot=i;
        for(int j=i+1;j<=n;++j){
        	if(fabs(B[j][i])>fabs(B[pivot][i])){
        		pivot=j;
        	}
		}
        swap(B[i],B[pivot]);
        if(fabs(B[i][i])<EPS){
        	return 0;
        }
        for(int j=i+1;j<=n*2;++j){
        	B[i][j]/=B[i][i];
        }
        for(int j=1;j<=n;++j){
        	if(i!=j){
        		for(int k=i+1;k<=n*2;++k){
					B[j][k]-=B[j][i]*B[i][k];
				}
			}
        }
    }
    for(int i=1;i<=n;++i){
    	for(int j=n+1;j<=n*2;++j){
    		C[i][j-n]=B[i][j];
    	}
    }
}
int T;
int main()
{
//	freopen("nijuzhen2.in","r",stdin);
//	freopen("nijuzhen2.out","w",stdout);
	char t[10];
	while(scanf("%d",&n)!=EOF){
		memset(A,0,sizeof(A));
		for(int i=1;i<=n;++i){
			for(int j=1;j<=n;++j){
				scanf("%lf",&A[i][j]);
			}
		}
		if(guass_jordan()){
			for(int i=1;i<=n;++i){
				for(int j=1;j<=n;++j){
					sprintf(t,"%.3f",C[i][j]);
					if(t[0]=='-' && t[1]=='0' && t[2]=='.' && t[3]=='0' && t[4]=='0' && t[5]=='0'){
						printf("0.000%c",j==n ? '
' : ' ');
					}
					else{
						printf("%.3f%c",C[i][j],j==n ? '
' : ' ');
					}
				}
			}
		}
		else{
			puts("NO");
		}
	}
    return 0;
}
原文地址:https://www.cnblogs.com/autsky-jadek/p/7628137.html