#4#8WA,刚学高斯消元求助

P2455 [SDOI2006] 线性方程组

我太强了 @ 2019-08-23 00:27:41

大佬们快来看看qwq

#include<bits/stdc++.h>
using namespace std;
int n,flag;
double ans[105];
struct matrix
{ 
     double z[105][105];
     matrix() 
     { 
        memset(z,0,sizeof(z));
     } 
}a;
int gauss() 
{ 
    for(int i=1;i<=n;i++) 
    { 
        if(a.z[i][i]==0) 
        for(int j=i+1;j<=n;j++) if(a.z[j][i]!=0) 
        { 
            for(int k=1;k<=n+1;k++) swap(a.z[i][k],a.z[j][k]);
            break;
        } 
        if(!a.z[i][i]) 
        { 
            for(int j=1;j<=n;j++) if(a.z[j][n+1]!=0) return -1;
            return 0;
        } 
        for(int j=i+1;j<=n;j++) 
        { 
            double mul=a.z[j][i]/a.z[i][i];
            for(int k=1;k<=n+1;k++) a.z[j][k]-=a.z[i][k]*mul;
        } 
    } 
    return 2;
} 
void work() 
{ 
    ans[n]=a.z[n][n+1]/a.z[n][n];
    for(int i=n-1;i>=1;i--) 
    { 
        for(int j=n;j>=i-1;j--) a.z[i][n+1]-=a.z[i][j]*ans[j];
        ans[i]=a.z[i][n+1]/a.z[i][i];
    } 
} 
int main() 
{ 
    scanf("%d",&n);
    for(int i=1;i<=n;i++) 
    for(int j=1;j<=n+1;j++) scanf("%lf",&a.z[i][j]);
    flag=gauss();
    if(flag==0||flag==-1) printf("%d\n",flag);
    else 
    { 
        work();
        for(int i=1;i<=n;i++) 
        if(fabs(ans[i])>1e-8) printf("x%d=%.2lf\n",i,ans[i]);
        else printf("x%d=0\n",i);
    } 
    return 0;
} 

by 未见堇开 @ 2019-08-23 11:32:21

@您太强了 在我看来,你是不撞NaN墙不回头。

gauss()中没有判定对角线的元素是否为0,很容易就会NaN,导致特判出错。


by 我太强了 @ 2019-08-23 12:05:14

@Redspirit 啊那个啊,我早改了,但是还是没用。我一直80分,WA#4#8->WA#9#10->WA#8#10

这是最新代码

#include<bits/stdc++.h>
using namespace std;
int n,flag;
double ans[105];
struct matrix
{ 
     double z[105][105];
     matrix() 
     { 
        memset(z,0,sizeof(z));
     } 
}a;
void gauss() 
{ 
    for(int i=1;i<=n;i++) 
    { 
        int maxx=i;
        if(fabs(a.z[i][i])<1e-8) 
        for(int j=i+1;j<=n;j++) 
        if(fabs(a.z[j][i])>fabs(a.z[i][i])) maxx=j;
        if(maxx!=i) for(int k=1;k<=n+1;k++) swap(a.z[i][k],a.z[maxx][k]);
        if(fabs(a.z[i][i])<1e-8) continue;
        for(int j=i+1;j<=n;j++) 
        { 
            double mul=a.z[j][i]/a.z[i][i];
            for(int k=1;k<=n+1;k++) a.z[j][k]-=a.z[i][k]*mul;
        } 
    } 
}   
int check() 
{ 
    int none=0,inf=0;
    for(int i=1;i<=n;i++) 
    { 
        int cnt=0;
        for(int j=1;j<=n+1;j++) if(fabs(a.z[i][j])<1e-8)  cnt++;
        if(cnt==n&&fabs(a.z[i][n+1])>1e-8) none=1;
        if(cnt==n+1) inf=1;
    } 
    if(none) return -1;
    if(inf) return 0;
    return 1;
} 
void work() 
{ 
    ans[n]=a.z[n][n+1]/a.z[n][n];
    for(int i=n-1;i>=1;i--) 
    { 
        for(int j=n;j>=i+1;j--) a.z[i][n+1]-=a.z[i][j]*ans[j];
        ans[i]=a.z[i][n+1]/a.z[i][i];
    } 
} 
int main() 
{ 
    scanf("%d",&n);
    for(int i=1;i<=n;i++) 
    for(int j=1;j<=n+1;j++) scanf("%lf",&a.z[i][j]);
    gauss();
    flag=check();
    if(flag==0||flag==-1) printf("%d\n",flag);
    else 
    { 
        work();
        for(int i=1;i<=n;i++) 
        if(fabs(ans[i])>1e-10) printf("x%d=%.2lf\n",i,ans[i]);
        else printf("x%d=0\n",i);
    } 
    return 0;
} 

上一页 |