高斯消元解线性方程
核心
1. 线性代数的解题逻辑,理清思路即可
2. 需要弄清r和c两个变量的含义
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int N = 110;
const double eps = 1e-6;
double a[N][N]; // double 类型
int n;
int guass() {
int r, c; //c用来循环列,r记录有多少行进行了调整
for (r = 0, 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; //表示当前列全部为0
for (int i = c; i < n + 1; i++) swap(a[r][i], a[t][i]); //交换r行和t行的数
for (int i = n; i >= c; i--) a[r][i] /= a[r][c]; //首位变成1
for (int i = r + 1; i < n; i++) {
if (fabs(a[i][c]) > eps) { // 如果当前c列的这一行开始为0,则不需要减
for (int j = n; j >= c; j--) {
a[i][j] -= a[r][j] * a[i][c];
}
}
}
r++;
} // 循环结束的时候,判断r是不是为n,如果不是,说明有行左边全为0
if (r < n) {
for (int i = r; i < n; i++) { //右侧有部位0,则无解
if (fabs(a[i][n]) > eps) return 2;
}
return 1;
}
for (int i = n - 1; i >= 0; i--) { // 对每一行的a[i][i]求解,也就是a[i][n],
for (int j = i + 1; j < n; j++) {
a[i][n] -= a[i][j] * a[j][n];
}
}
return 0;
}
int main() {
cin >> n;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n + 1; j++) {
cin >> a[i][j];
}
}
int t = guass();
if (t == 0) {
for (int i = 0; i < n; i++) printf("%.2lf\n", a[i][n]);
} else if (t == 1) {
cout << "Infinite group solutions" << endl;
} else {
cout << "No solution" << endl;
}
return 0;
}