80pts求助

P2455 [SDOI2006] 线性方程组

Orange1015 @ 2023-04-07 11:42:09

高斯约旦消元,80pts

#include<bits/stdc++.h>
using namespace std;
#define MAXN 105
double a[MAXN][MAXN],ans[MAXN];
int n,flag;
void prt(){
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n+1;j++)
        cout<<a[i][j]<<" ";
        cout<<endl;
    }
    return;
}
void gauss(){
    int r;
    for(int i=1;i<=n;i++){
        r=i;
        for(int j=i+1;j<=n;j++){
            if(fabs(a[j][i])>fabs(a[r][i])){
                r=j;
            }
        }
        if(i!=r){
            swap(a[i],a[r]);
        }
        if(a[i][i]==0){
            bool f=0;
            for(int j=i;j<=n;j++){
                if(a[i][j]!=0){
                    f=1;
                }
            }
            if(!f){
                if(a[i][n+1]!=0) flag=-1;
                else flag=0;
                return;
            }
        }
        for(int j=1;j<=n;j++){
            if(j!=i){
                double tmp=a[j][i]/a[i][i];
                for(int k=i;k<=n+1;k++){
                    a[j][k]=(a[j][k]-a[i][k]*tmp);
                }
            }
        }
        //prt();
    }
    for(int i=1;i<=n;i++){
        if(a[i][i]==0){
            if(a[i][n+1]==0) flag=0;
            else flag=-1;
            return;
        }
    }
    flag=1;
    return;
}
int main(){
    std::ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin >> n;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n+1;j++){
            cin >> a[i][j];
        }
    }
    gauss();
    if(flag == 1){
        for(int i=1;i<=n;i++){
            ans[i]=a[i][n+1]/a[i][i];
            if(ans[i]==-0.0) ans[i]=0.00;
            printf("x%d=%.2lf\n",i,ans[i]);
        }
    }
    else{
        cout << flag;
    }
    return 0;
} 

|