基础知识
求方程组的解即为线性代数中Ax=b的解。
通过高斯消元,将每一个要解的变量系数化为1。
若主对角线上均为1,则正好有一组解,带回求解即可。
若有一组方程化简完后为 0=0形式,则有无数组解。
若有一组方程为,0 = b的形式,那么则无解。
代码即为模拟消元的过程:
模板题:https://www.acwing.com/problem/content/885/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
| #include<bits/stdc++.h> using namespace std; const int N =110; double a[N][N]; const double eps = 1e-8; int n; int gauss() { int c; int r =0; for(c=0;c<n;c++) { int t =r; for(int i=r;i<n;i++) { if(fabs(a[i][c])>fabs(a[t][c])) t =i; } if(fabs(a[t][c])<eps) continue; for(int i =c;i<=n;i++) swap(a[t][i],a[r][i]); for(int i=n;i>=c;i--) a[r][i] = a[r][i]/a[r][c]; for(int i=r+1;i<n;i++) { if(abs(a[i][c])>eps) { for(int j=n;j>=c;j--) { a[i][j] =a[i][j] -a[r][j]*a[i][c]; } } } r++; } if(r<n) { for (int i = r; i < n; i ++ ) if (fabs(a[i][n]) > eps) return 2; return 1; } for(int i=n-1;i>=0;i--) { for(int j=i+1;j<n;j++) { a[i][n] =a[i][n]- a[j][n] * a[i][j]; } } return 0; } int main(void) { scanf("%d",&n); for(int i=0;i<n;i++) { for(int j=0;j<=n;j++) { scanf("%lf",&a[i][j]); } } int res= gauss(); if(res==1) { printf("Infinite group solutions\n"); } else if(res==2) { printf("No solution\n"); } else { for(int i=0;i<n;i++) { if (fabs(a[i][n]) < eps) a[i][n] = 0; printf("%.2lf\n",a[i][n]); } } }
|