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