高斯消元学习笔记

来源:互联网 发布:python django教程 编辑:程序博客网 时间:2024/06/01 07:17

思路:

没什么难的,模拟就可以
唯一需要注意的是判断无解还是无穷解,因为做完高斯的时候是一行对一个元的答案,那么如果出现一行全是0的情况就判为无穷解,但是这还不够,因为后面还有可能出现无解的情况,也就是前面全是0而答案不为0的情况,所以要扫完整个矩阵,再出答案。
复杂度O(n^3)

代码:

#include<cstdio>#include<iostream>#include<cstring>#include<cmath>using namespace std;const int max_n = 55;const int inf = 1e6+7;double g[max_n][max_n];int n;inline int check(int x){    int  ok=0;    for(int i=x; i<=n; ++i)      if(g[x][i]!=0)       {        ok=i;        break;      }    if(!ok)    {        if(g[x][n+1]) return 2;        else return 1;    }    else if(ok!=x) return 3;}inline void gauss(){    for(int i=1; i<=n; ++i)    {        int now=i;        for(int j=i+1; j<=n; ++j)          if(fabs(g[now][i])<fabs(g[j][i]))            now=j;        for(int j=1; j<=n+1; ++j)          swap(g[now][j],g[i][j]);        if(g[i][i]==0) continue;        for(int j=i+1; j<=n+1; ++j)          g[i][j]/=g[i][i];        g[i][i]=1;        for(int j=1; j<=n; ++j)          if(j!=i)          {            for(int k=i+1; k<=n+1; ++k)              g[j][k]-=g[j][i]*g[i][k];            g[j][i]=0;          }    }    bool ok=false;    for(int i=1; i<=n; ++i)    {        int temp=check(i);        if(temp==1) ok=true;        if(temp==2)        {            printf("-1\n");            return;        }    }    if(ok)    {        printf("0\n");        return;    }       for(int i=1; i<=n; ++i)    {        if(g[i][n+1]==0)          printf("x%d=0\n",i);        else           printf("x%d=%.2lf\n",i,g[i][n+1]);    }}int main(){    freopen("gaess.in","r",stdin);    freopen("gaess.out","w",stdout);    scanf("%d",&n);    for(int i=1; i<=n; ++i)      for(int j=1; j<=n+1; ++j)        scanf("%lf",&g[i][j]);    gauss();    return 0;}