高斯消元
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
const int eps=1e-8;
const int N=15;
double a[N][N],b[N],c[N][N];
int n;
void SWAP(int x,int y)
{
for(int i=1;i<=n;i++) swap(c[x][i],c[y][i]);
swap(b[x],b[y]);
}
void sub(int x,int y,double k)//x-y*k
{
for(int i=1;i<=n;i++) c[x][i]-=c[y][i]*k;
b[x]-=b[y]*k;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n+1;i++)
for(int j=1;j<=n;j++) scanf("%lf",&a[i][j]);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
c[i][j]=2*(a[i][j]-a[i+1][j]),b[i]+=a[i][j]*a[i][j]-a[i+1][j]*a[i+1][j];
for(int i=1;i<=n;i++)
{
if( fabs(c[i][i])>eps ) continue;
for(int j=i+1;j<=n;j++)
if(fabs(c[j][i])>eps){ SWAP(i,j); break;}
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(i==j) continue;
sub(j,i,c[j][i]/c[i][i]);
}
for(int i=1;i<=n;i++) printf("%.3lf ",b[i]/c[i][i]);
return 0;
}
这种写法比树上简便好理解
注意double类型判断是不是0最好和eps比较