蒟蒻高斯消元解判定出错,一直调不出,WA 50pts,求大佬帮忙分析一下

P2455 [SDOI2006] 线性方程组

YANGKAIHAN1 @ 2022-11-05 20:41:41

评测记录

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

constexpr int N=105;
constexpr double eps=1e-18;

double a[N][N];
int n;
//高斯消元
//返回值1表示有唯一解,2表示有无数解,3表示无解
inline int gauss(void){
    register int col=0,lin=0;//分别表示行和列
    for(;col<n;col++,lin++){
        register int mx=lin;
        for(register int j=lin;j<n;j++)
            if(fabs(a[j][col])>fabs(a[mx][col]))
                mx=j;

        if(fabs(a[mx][col])<=eps)
            continue;

        for(register int j=col;j<=n;j++)
            swap(a[mx][j],a[lin][j]);
        for(register int j=n;j>=col;j--)
            a[lin][j]/=a[lin][col];
        for(register int j=lin+1;j<n;j++)
            if(fabs(a[j][col])>eps)
                for(register int k=n;k>=col;k--)
                    a[j][k]-=a[lin][k]*a[j][col];
    }
    for(register int i=n-1;i>=0;i--)
        for(register int j=i+1;j<n;j++)
            a[i][n]-=a[i][j]*a[j][n];

//判定(出锅点)
    if(lin<n){
        for(register int i=lin;i<n;i++)
            if(fabs(a[i][n])>eps)
                return 3;
        return 2;
    }
    return 1;
}

int main(void){
    ios::sync_with_stdio(false);
    cin>>n;
    for(int i=0;i<n;i++)
        for(int j=0;j<=n;j++)
            cin>>a[i][j];

    register int state=gauss();
    if(state==1)
        for(register int i=0;i<n;i++)
            cout<<"x"<<i+1<<"="<<fixed<<setprecision(2)<<a[i][n]<<endl;
    else if(state==2)
        cout<<0<<endl;
    else
        cout<<-1<<endl;

    return 0;
}

|