#include <stdio.h>
int main()
{
puts("转载请注明出处谢谢");
puts("http://blog.youkuaiyun.com/vmurder/article/details/43445323");
}
题解:
虽然是说有唯一解,但是依然需要在消到某一层时判0/非0,然后适当交换位置。
代码:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 105
#define eps 1e-3
using namespace std;
int n;
double a[N][N],ans[N];
void Gauss()
{
int i,j,k;
for(i=1;i<=n;i++)
{
for(j=i;j<=n&&!a[j][i];j++);
if(i!=j)for(k=i;k<=n+1;k++)swap(a[i][k],a[j][k]);
for(j=i+1;j<=n;j++)
{
for(k=n+1;k>=i;k--)
{
a[j][k]-=a[i][k]/a[i][i]*a[j][i];
}
}
}
for(i=n;i;i--)
{
ans[i]=a[i][n+1];
for(j=i+1;j<=n;j++)ans[i]-=a[i][j]*ans[j];
ans[i]/=a[i][i];
}
}
int main()
{
freopen("test.in","r",stdin);
int i,j,k;
scanf("%d",&n);
for(i=1;i<=n;i++)
for(j=1;j<=n+1;j++)
scanf("%lf",&a[i][j]);
Gauss();
for(i=1;i<=n;i++)
{
printf("%d",(int)(ans[i]+eps));
if(i!=n)printf(" ");
}
return 0;
}