写两个高斯消元的热身题.主要是熟悉下高斯消元...呜呜呜,当初学的ex_gcd和中国剩余定理都忘了QAQ.
刷完进阶指南萌新打算刷kuangbin QAQ
水题1:207.球形空间产生器
思路:
(x1-a[0][0])^2+(x2-a[0][1])^2+(x3-a[0][2])^2+...+(xn-a[0][n-1])^2=xn+1^2 (1)
(x1-a[1][0])^2+(x2-a[1][1])^2+(x3-a[1][2])^2+...+(xn-a[1][n-1])^2=xn+1^2 (2)
(x1-a[2][0])^2+(x2-a[2][1])^2+(x3-a[2][2])^2+...+(xn-a[2][n-1])^2=xn+1^2 (3)
...
(x1-a[n][0])^2+(x2-a[n][1])^2+(x3-a[n][2])^2+...+(xn-a[n][n-1])^2=xn+1^2 (n+1)
我们拿(2)~(n+1)对(1)求差.即可化为n个n-1元方程组.
2(a[0][j]-a[i][j])x1+2(a[0][j]-a[i][j])x2+2(a[0][j]-a[i][j])x3+...2(a[0][j]-a[i][j])xn=求和(1-n)(a[i][j]-a[0][j])^2
大概就是n个这样的方程.
然后就是解方程了!
//水题练手1. #include <bits/stdc++.h> using namespace std; const int N=15; double a[N][N]; double b[N][N]; const double eps=1e-6; int n; void geuss() { int c,r; for(c=0,r=0;c<n;c++) { int t=r; for(int i=r+1;i<n;i++) { if(fabs(b[i][c])>fabs(b[t][c])) t=i; } for(int i=0;i<=n;i++) swap(b[t][i],b[r][i]); if(fabs(b[t][c])<=eps) continue; for(int i=n;i>=c;i--) b[r][i]/=b[r][c]; for(int i=r+1;i<n;i++) { for(int j=n;j>=c;j--) { b[i][j]-=b[i][c]*b[r][j]; } } r++; } for(int i=n-1;i>=0;i--) { for(int j=i+1;j<n;j++) { b[i][n]-=b[j][n]*b[i][j]; } } } int main()//n行 n+1列 { cin>>n; for(int i=0;i<=n;i++) { for(int j=0;j<n;j++) { scanf("%lf",&a[i][j]); } } for(int i=1;i<=n;i++) { for(int j=0;j<n;j++) { b[i-1][j]=2*(a[i][j]-a[0][j]); b[i-1][n]+=(a[i][j]*a[i][j]-a[0][j]*a[0][j]); } } geuss(); for(int i=0;i<n;i++) printf("%.3lf ",b[i][n]); cout<<endl; return 0; }