题目链接:P3389 高斯消元法
算法原理:
- 两方程互换,解不变
- 一方程乘以非零数k,解不变
- 一方程乘以数k加上另一方程,解不变
代码:
#include <bits/stdc++.h>
using 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("%.2f\n", 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