90pts求助-判断无解和无穷多解出错

P2455 [SDOI2006] 线性方程组

lpx2024 @ 2024-01-19 08:24:34

无解和无穷多解记flag最后集中处理了

记录:https://www.luogu.com.cn/record/141558770

代码

#include<bits/stdc++.h>
#include<cmath>
#define eps 1e-8
using namespace std;
double a[110][110],b[110];
int main(){
    int n,flag=0;
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            scanf("%lf",&a[i][j]);
        }
        scanf("%lf",&b[i]);
    }
    for(int i=1;i<=n;i++){
        //找一个不为0的值 
        int fl2=0;
        for(int j=i;j<=n;j++){
            if(fabs(a[j][i])>eps){
                if(i!=j){
                    for(int k=i;k<=n;k++) swap(a[j][k],a[i][k]);
                    swap(b[i],b[j]);
                }
                break;
            }
            if(j==n) flag=1,fl2=1;
        }
        if(fl2){
            fl2=0;
            continue; 
        }
        //把a[i][i]的值设为1 
        b[i]/=a[i][i];
        for(int j=n;j>=i;j--) a[i][j]/=a[i][i];
        //进行消元 
        for(int j=i+1;j<=n;j++){
            b[j]-=b[i]*a[j][i];
            for(int k=n;k>=i;k--){
                a[j][k]-=a[j][i]*a[i][k];
            }
        }//形成三角矩阵 
    }
    if(flag){
        for(int i=n;i;i--){
            for(int j=1;j<=n;j++){
                if(fabs(a[i][j])>eps){
                    puts("0");
                    return 0;
                }
            }
            if(fabs(b[i])>eps){
                puts("-1");
                return 0;
            }
        }
        return 0;
    }
    for(int i=n;i;i--){
        for(int j=i-1;j;j--){
            b[j]-=a[j][i]*b[i];
            a[j][i]-=a[j][i];
        }
    }
    for(int i=1;i<=n;i++){
        printf("x%d=%.2lf\n",i,b[i]);
    }
    return 0;
}

|