高斯消元

/约旦消元法大致思路如下:
1.选择一个尚未被选过的未知数作为主元,选择一个包含这个主元的方程。
2.将这个方程主元的系数化为1。
3.通过加减消元,消掉其它方程中的这个未知数。
4.重复以上步骤
/

#include<bits/stdc++.h> 
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define dwn(i,a,b) for(int i=a;i>=b;--i)
#define X (c^48)
#define C c=getchar()
#define ee(i,x) for(int i=head[x];i;i=e[i].next)
template <typename T> void inline rd(T&x){char c;int f=1;while(!isdigit(C))if(c=='-')f=-1;x=X;while(isdigit(C))x=x*10+X;x*=f;}
#define debug printf("Now is %d
",__LINE__);
using namespace std;
#define N 105
double a[N][N];
int n;
int main()
{
	freopen("read.txt","r",stdin); 
    rd(n);
    rep(i,1,n)
    	rep(j,1,n+1)
    		rd(a[i][j]);
	
    rep(i,1,n)//枚举列
    {
    	int max=i;
        rep(j,i+1,n)//选出该列最大系数 
            if(fabs(a[j][i])>fabs(a[max][i]))//fabs是取浮点数的绝对值的函数
                max=j;
        rep(k,1,n+1)
        	swap(a[max][k],a[i][k]);
            
		if(!a[i][i])//最大值等于0则说明该列都为0,肯定无解||有无数种解 
        {
            puts("No Solution");
            return 0;
        }
        
		rep(j,1,n)//每一项都减去一个数(小学加减消元)
        {
            if(j!=i)
            {
                double temp=a[j][i]/a[i][i];
                rep(k,i+1,n+1)
                    a[j][k]-=a[i][k]*temp;
            }
        }
	}
    //上述操作结束后,矩阵会变成这样
    /*
    k1*a=e1
    k2*b=e2
    k3*c=e3
    k4*d=e4
    e.g.
    2     0    0          2
    0     3/2  0         -2
    0     0    2/3        2
    */
    //所以输出的结果要记得除以该项系数,消去常数
	rep(i,1,n)
		printf("%.2lf
",a[i][n+1]/a[i][i]);
	return 0;
}
原文地址:https://www.cnblogs.com/sjsjsj-minus-Si/p/11635524.html