模板_高斯消元

//
#include<bits/stdc++.h>
using namespace std;

const double EPS=1e-7;
const int N=111;
double in[N][N];

int main()
{
    int n,i,j,k,maxa;
	double tt;				// double
    
    while( cin>>n )
    {
        memset( in,0,sizeof( in ) );
        for( i=1;i<=n;i++ )
            for( j=1;j<=n+1;j++ )
                cin>>in[i][j];

        for( i=1;i<=n;i++ )                         	// 枚举列
        {
            maxa=i;		// j=i+1 
            for( j=i+1;j<=n;j++ )                   	// 找到该列最大系数		(1)
                if( fabs( in[j][i] )>fabs( in[maxa][i] ) ) maxa=j;
            			// j<=n+1 
            for( j=1;j<=n+1;j++ )
                swap( in[maxa][j],in[i][j] );       	// 交换行				(2)
            
            // 对角线的主元系数为0 没有唯一解
            if( fabs( in[i][i] )<EPS ) { cout<<"-1"; goto out; }
			
			// 该行同除主元系数 从后往前 不然in[i][i]提前变化 					    (3)
            for( j=n+1;j;j-- ) in[i][j]/=in[i][i];
	
            for( j=1;j<=n;j++ )                     	// 该列其他系数置零		(4)
                if( j!=i )
                {
                    tt=in[j][i]/in[i][i];
                    for( k=1;k<=n+1;k++ ) in[j][k]-=in[i][k]*tt;
                }
        }
        for( i=1;i<=n;i++ ) printf("%.2lf\n",in[i][n+1] );
        out:;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_63173957/article/details/125172532
今日推荐