为啥我两种判断都加就过了,加任意一种只有90?

P2455 [SDOI2006] 线性方程组

Starrydream @ 2018-10-24 11:02:21

判断无解或者无穷解的原理不是当前行其他元都带入消掉后看看形如ax=b这种分类讨论下吗。。 以下是我的代码

#include <cstdlib>
#include <algorithm>
#include <iostream>
#include <cstdio>
#include <cmath>
#define maxn 555
const double eps = 1e-8;
double A[maxn][maxn];
bool flag;
int  n ;
void Gauss() {
    for(int i = 0; i < n; i ++) {//for each row(varieble)
        int r = i;
        for(int j = i + 1; j < n; j ++)
            if(fabs(A[j][i]) > fabs(A[r][i])) r = j;
        if(r != i) for(int j = 0; j <= n; j ++) std :: swap(A[r][j], A[i][j]);
        if(fabs(A[i][i]) < eps) continue;
        for(int j = n; j >= i; j --) {
            for(int k = i + 1; k < n; k ++)
                A[k][j] -= A[k][i] / A[i][i] * A[i][j];
        }
    }

//  
    for(int i = 0 ; i < n ; ++i)
    {
        bool IF = false , ALL = false;
        for(int j = 0 ; j < n ; ++j)
            if(fabs(A[i][j]) > eps)
                IF = true;
        if(fabs(A[i][n]) > eps)
            ALL = true;
        if(!IF){
            if(!ALL) {
                puts("0"); flag = true; return;
            }
            else {
                puts("-1") ; flag = true ; return;
            }

        }
    }

    for(int i = n - 1; i >= 0; i --) {
        for(int j = i + 1; j < n; j ++){
            A[i][n] -= A[j][n] * A[i][j];
        }
        if(fabs(A[i][i]) < eps){
            if(fabs(A[i][n]) < eps){
                puts("0") , flag = true;
                return;
            }
            else if(fabs(A[i][n]) > eps){//ax = b 
                puts("-1") , flag = true;
                return;
            }
        }
        A[i][n] /= A[i][i];
    }
}
int main()
{
    scanf("%d",&n);
    for(int i = 0 ; i < n ; ++i)
        for(int j = 0 ; j <= n ; ++j)   
            scanf("%lf",&A[i][j]);
    Gauss();
    if(flag) return 0;
    for(int i = 0 ; i < n ; ++i)
        printf("x%d=%.2lf\n",i+1,A[i][n]);
}

|