代码:算法原理:
- 两方程互换,解不变
- 一方程乘以非零数k,解不变
- 一方程乘以数k加上另一方程,解不变
#includeusing namespace std; double a[105][105]; int main() { int n; cin >> n; for (int i = 0; i < n; i++) { for (int j = 0; j <= n; j++) { cin >> a[i][j]; } } for (int j = 0; j < n; j++) { // 枚举行 int i; for (i = j; i < n; i++) { // 向下找非零行 if (a[i][j]) break; } if (a[i][j] == 0) { // 无非零行,则无解 cout << "No Solution" << endl; return 0; } for (int k = 0; k <= n; k++) { // 将非零行交换到当前行 swap(a[i][k], a[j][k]); } for (int k = n; k >= j; k--) { // 归一性,将每行第一个非零元素化为1,整行元素同时除以a[j][j]即可 a[j][k] /= a[j][j]; } for (int i = 0; i < n; i++) { // 排他性,该元素所在的列的其他元素都化为零 if (i != j) { for (int k = n; k >= j; k--) { a[i][k] -= a[j][k] * a[i][j]; } } } } for (int i = 0; i < n; i++) { printf("%.2fn", a[i][n]); } return 0; }
时间复杂度:O()
附矩阵变化过程:
输入: 3 1 3 4 5 1 4 7 3 9 3 2 2 1 3 4 5 1 4 7 3 9 3 2 2 1 3 4 5 1 4 7 -2 9 3 2 2 1 3 4 5 1 4 3 -2 9 3 2 2 1 3 4 5 1 1 3 -2 9 3 2 2 1 3 4 5 0 1 3 -2 9 3 2 2 1 3 4 5 0 1 3 -2 9 3 2 -43 1 3 4 5 0 1 3 -2 9 3 -34 -43 1 3 4 5 0 1 3 -2 9 -24 -34 -43 1 3 4 5 0 1 3 -2 0 -24 -34 -43 1 3 4 11 0 1 3 -2 0 -24 -34 -43 1 3 -5 11 0 1 3 -2 0 -24 -34 -43 1 0 -5 11 0 1 3 -2 0 -24 -34 -43 1 0 -5 11 0 1 3 -2 0 -24 -34 -91 1 0 -5 11 0 1 3 -2 0 -24 38 -91 1 0 -5 11 0 1 3 -2 0 0 38 -91 1 0 -5 -0.973684 0 1 3 -2 0 0 1 -2.39474 1 0 0 -0.973684 0 1 3 -2 0 0 1 -2.39474 1 0 0 -0.973684 0 1 3 5.18421 0 0 1 -2.39474 1 0 0 -0.973684 0 1 0 5.18421 0 0 1 -2.39474



