原理就是跟咱們普通解方程組同樣,還要暴力些。html
代碼實現,你想怎麼暴力就怎麼暴力,n³暴力打出來就是高斯消元了。ide
先放模板:spa
bzoj1013 球形空間產生器code
1 #include <cstdio> 2 #include <algorithm> 3 #include <cmath> 4 5 const int N = 20; 6 const double eps = 1e-10; 7 8 double a[N][N], b[N][N], sum[N]; 9 int n; 10 11 inline void out() { 12 printf("\n"); 13 for(int i = 1; i <= n; i++) { 14 for(int j = 1; j <= n + 1; j++) { 15 printf("%.2lf ", a[i][j]); 16 } 17 puts(""); 18 } 19 puts(""); 20 return; 21 } 22 23 inline void Gauss() { 24 for(int i = 1; i < n; i++) { /// lie 25 int j = i; 26 while(j <= n && fabs(a[j][i]) < eps) { 27 j++; 28 } 29 if(j != i) { 30 std::swap(a[i], a[j]); 31 } 32 for(int j = i + 1; j <= n; j++) { /// hang 33 double k = a[j][i] / a[i][i];/// a * k = b k = b / a; 34 for(int p = i; p <= n + 1; p++) { 35 a[j][p] -= k * a[i][p]; 36 } 37 } 38 } 39 for(int i = n; i > 1; i--) { /// lie 40 for(int j = i - 1; j >= 1; j--) { /// hang 41 double k = a[j][i] / a[i][i]; 42 a[j][i] -= a[i][i] * k; 43 a[j][n + 1] -= a[i][n + 1] * k; 44 } 45 } 46 return; 47 } 48 49 int main() { 50 scanf("%d", &n); 51 for(int i = 1; i <= n + 1; i++) { 52 for(int j = 1; j <= n; j++) { 53 scanf("%lf", &b[i][j]); 54 } 55 } 56 57 for(int i = 1; i <= n; i++) { 58 for(int j = 1; j <= n; j++) { 59 a[i][j] = b[i + 1][j] - b[i][j]; 60 sum[i] += b[i][j] * b[i][j]; 61 } 62 a[i - 1][n + 1] = sum[i] - sum[i - 1]; 63 } 64 for(int i = 1; i <= n; i++) { 65 sum[n + 1] += b[n + 1][i] * b[n + 1][i]; /// b --> a 66 } 67 a[n][n + 1] = sum[n + 1] - sum[n]; 68 69 Gauss(); 70 for(int i = 1; i <= n; i++) { 71 printf("%.3lf ", a[i][n + 1] / a[i][i] / 2); 72 } 73 74 return 0; 75 }
這個模板是對的,可是最後輸出 / 2 是由於我一開始把平方公式記錯了,少了個2......htm
通常有什麼用呢?blog
1,遇到解方程裸題,不用多說,能夠解%意義下的方程,乘逆元/展轉相減 便可。get
2,解異或方程組。例題it
3,求解一些互相關聯的值,如指望,DP等。io