高斯消元

code:

const int N=110;
const double eps=1e-7;

int n;
double a[N][N];

inline bool zero(double x){
    return fabs(x)<eps;
}

int gauss(){
    for(int i=1;i<=n;i++){
        int aim=i;
        //找出 i 列中,未确定主元的行中的最大行
        for(int j=1;j<=n;j++){
            //判断是否确定主元
            if(j<i&&!zero(a[j][j]))
                continue;
            if(fabs(a[j][i])>fabs(a[aim][i]))
                aim=j;
        }

        if(zero(a[aim][i]))
            continue;

        //交换aim行和i行
        for(int j=1;j<=n+1;j++)
            swap(a[aim][j],a[i][j]);

        //a[i][i] 位置置为1
        for(int j=n+1;j>=i;j--)
            a[i][j]/=a[i][i];

        for(int j=1;j<=n;j++){//第i列出来第i行,全部消为0
            if(j==i)
                continue;
            double t=a[j][i]/a[i][i];
            for(int k=i;k<=n+1;k++)
                a[j][k]-=a[i][k]*t;
        }
    }
    //判断解
    int ret=1;
    for(int i=1;i<=n;i++){
        if(zero(a[i][i])&&!zero(a[i][n+1])){
            ret=0;
            break;
        }
        if(zero(a[i][i]))
            ret=2;
    }
    return ret;
}

posted @ 2025-09-13 14:43  xdhking  阅读(12)  评论(0)    收藏  举报