您的位置:首页 > 其它

[SDOI2006]线性方程组 高斯消元

2018-01-02 19:29 465 查看
板子题,注意消元的时候无解判断和常数项的操作

码:

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
#define eps 1e-8
int i,j,n,k,st;
double x[105],a[105][105];
int gauss()
{
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(a[i][j]-eps>0||a[i][j]+eps<0){st=j;break;}
} double o=a[i][st];
for(k=n+1;k>=1;k--)
a[i][k]/=o;
for(j=1;j<=n;j++)//消元
{
if(j==i)continue;
if(a[j][st]-eps>0||a[j][st]+eps<0)
{
double lo=a[j][st];
for(k=1;k<=n+1;k++)
{
a[j][k]-=lo*a[i][k];
}

}
}
}
bool dj=0;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(a[i][j]-eps>0||a[i][j]+eps<0)
{
if(x[j]+eps>0&&x[j]-eps<0)
{
x[j]=a[i][n+1]; break;
}else
{
if(fabs(x[j]-a[i][j])<eps)dj=1;
else return -1;
}
}
}
if(j==n+1)
{
if(a[i][j]-eps>0||a[i][j]+eps<0)return -1;
else dj=1;
}
}
if(dj)return 1;
else return 0;
}
int main()
{
scanf("%d",&n);
for(i=1;i<=n;i++)
{
for(j=1;j<=n+1;j++)
{
scanf("%lf",&a[i][j]);
}
}
int o=gauss();
if(o==-1)printf("-1");
else if(o==1) printf("0");
else for(i=1;i<=n;i++)
printf("x%d=%.2lf\n",i,x[i]);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: