写两个高斯消元的热身题.主要是熟悉下高斯消元...呜呜呜,当初学的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;
}
京公网安备 11010502036488号