80分,高斯消元,无解无数解无法判断!!

P2455 [SDOI2006] 线性方程组

ouliang @ 2024-03-07 21:52:46

#include<bits/stdc++.h>
using namespace std;
int n,m;
double cl[200][200],ans[200],bl;
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
      for(int j=1;j<n+2;j++)
        scanf("%lf",&cl[i][j]);
    for(int i=1;i<=n;i++)
    {
        m=i;
        for(int j=i+1;j<=n;j++)
          if(fabs(cl[i][i])<fabs(cl[j][i]))
            m=j;
        if(fabs(cl[m][i])<1e-9)
          continue;
        if(i!=m)
          swap(cl[i],cl[m]);
        bl=cl[i][i];
        for(int j=i;j<n+2;j++)
          cl[i][j]/=bl;
        for(int j=i+1;j<=n;j++)
        {
            bl=cl[j][i];
            for(int k=i;k<n+2;k++)
              cl[j][k]-=cl[i][k]*bl;
        }
    }
    ans[n]=cl[n][n+1];
    for(int i=n-1;i>0;i--)
    {
        ans[i]=cl[i][n+1];
        for(int j=i+1;j<=n;j++)
          ans[i]-=ans[j]*cl[i][j];
    }
    for(int i=1;i<=n;i++)
      if(fabs(cl[i][i])<1e-13)
      {
        if(fabs(cl[i][n+1])<1e-9)
          printf("0");
        else
          printf("-1");
        return 0;
      }
    for(int i=1;i<=n;i++)
      printf("x%d=%.2lf\n",i,ans[i]);
    return 0;
}

|