cogs721. [SDOI2007] 線性方程組

傳送門

人生中的第一個正確的高斯消元(第一個由於數據太水錯誤的代碼也過了)
判斷無解和無窮多解的方法非常神奇

CODE:

#include<cmath>
#include<cstdio>
#include<iostream>
using namespace std;
const double eps=1e-8;
double f[55][55];
int n;
bool ans1,ans2;
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",&f[i][j]);
    for(int i=1;i<=n;i++)
    {
        int p=i;
        for(int j=i+1;j<=n;j++)
          if(fabs(f[j][i])>fabs(f[p][i])) p=j;
        for(int j=1;j<=n+1;j++)
          swap(f[i][j],f[p][j]);
        if(fabs(f[i][i])<eps) continue;
        double tmp=f[i][i];
        for(int j=1;j<=n+1;j++)
          f[i][j]/=tmp;
        for(int k=1;k<=n;k++)
          if(k!=i)
          {
            tmp=f[k][i];
            for(int j=1;j<=n+1;j++)
              f[k][j]-=f[i][j]*tmp;
          }
    }
    for(int i=1;i<=n;i++)
    {
        bool all=1;
        for(int j=1;j<=n;j++)
          if(fabs(f[i][j])>=eps){all=0;break;}
        if(all)
          if(fabs(f[i][n+1])<eps) ans2=1;
          else ans1=1;
        else;
    }
    if(ans1) return printf("-1"),0;
    if(ans2) return printf("0"),0;
    for(int i=1;i<=n;i++)
      if(fabs(f[i][n+1])<eps) printf("x%d=0\n",i);
      else printf("x%d=%.2lf\n",i,f[i][n+1]);
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章