pt90求助!!

P2455 [SDOI2006] 线性方程组

Linno @ 2022-09-26 13:39:46

wa 第三个点,有没有大佬帮忙看看,感激不尽。

#include<bits/stdc++.h>
#define int long long
//#define double long double
#define eps 1e-15
using namespace std;
const int maxn=105;

int n;
double a[maxn][maxn];

signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    cin>>n; //注意这是n+1列的模板
    for(int i=1;i<=n;i++) for(int j=1;j<=n+1;j++) cin>>a[i][j]; //读入矩阵 
    for(int i=1;i<=n;i++){ //枚举列
        int mx=i; 
        for(int j=i+1;j<=n;j++){ //选出该列最大主元(系数)
            if(fabs(a[j][i])>fabs(a[mx][i])){ 
                mx=j; //记录该行
            }
        }
        for(int j=1;j<=n+1;j++) swap(a[i][j],a[mx][j]); //交换i和mx所在的两行 
        if(fabs(a[i][i])<eps) continue;
        for(int j=1;j<=n;j++){ //对于i以外的每一行
            if(j!=i){
                double tmp=a[j][i]/a[i][i];
                for(int k=i+1;k<=n+1;k++){ //对每一项做加减消元
                    a[j][k]-=a[i][k]*tmp;
                }
            }
        }
    }
    bool no=0,mul=0;
    for(int i=1;i<=n;++i){
        if(fabs(a[i][i])<eps&&fabs(a[i][n+1])>eps) no=1;
        if(fabs(a[i][i])<eps&&fabs(a[i][n+1])<eps) mul=1;
    }
    if(no){cout<<"-1\n";return 0;}
    if(mul){cout<<"0\n";return 0;}
    for(int i=1;i<=n;i++){
        double res=(a[i][n+1]/a[i][i]);
        if(fabs(res)<eps) res=fabs(res);
        cout<<"x"<<i<<"="<<fixed<<setprecision(2)<<res<<"\n";
    }
    return 0;
}

by _EEA_ @ 2022-10-03 14:12:12

你试一下这组数据:

6
1 2 3 4 5 6 10
0 0 1 2 3 4 15
0 0 0 2 6 7 30
0 0 0 0 6 8 10
0 0 0 0 0 1 30
0 0 0 0 0 0 0

应该输出 0,而你的输出了 -1


|