1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #define eps 1e-6 5 #define M 15 6 using namespace std; 7 double a[M],b[M][M]; 8 int n; 9 int main() 10 { 11 scanf("%d",&n); 12 for(int i=1;i<=n;i++) 13 scanf("%lf",&a[i]); 14 for(int i=1;i<=n;i++) 15 for(int j=1;j<=n;j++) 16 { 17 double t; 18 scanf("%lf",&t); 19 b[i][j]=2*(t-a[j]); 20 b[i][n+1]+=t*t-a[j]*a[j]; 21 } 22 for(int i=1;i<=n;i++) 23 { 24 int to; 25 for(to=i;to<=n;to++) 26 if(b[to][i]!=0) 27 break; 28 if(i!=to) 29 for(int j=1;j<=n+1;j++) 30 swap(b[i][j],b[to][j]); 31 double t=b[i][i]; 32 for(int j=i;j<=n+1;j++) 33 b[i][j]/=t; 34 for(int j=1;j<=n;j++) 35 if(j!=i) 36 { 37 t=b[j][i]; 38 for(int k=1;k<=n+1;k++) 39 b[j][k]-=t*b[i][k]; 40 } 41 } 42 for(int i=1;i<n;i++) 43 printf("%.3lf ",b[i][n+1]); 44 printf("%.3lf ",b[n][n+1]); 45 return 0; 46 }
先假设是二维的,设圆心为(x,y),那(x1-x)^2+(y1-y)^2=(xk-x)^2+(yk-y)^2
这样n+1个点就能构造出n个方程 然后高斯消元。(高斯消元不会的看看代码就知道了)