高斯消元
问题
求解线性方程组
算法思想
高斯消元法的实现主要分为两种,一种是普通的高斯消元,将系数矩阵消为上三角矩阵,再一步步回代求出所有未知数;第二种是高斯-约旦消元法,将系数矩阵消为对角矩阵,不需要回代即可直接解出未知数,这里展示第二种做法。
代码实现
例题:P3389 【模板】高斯消元法
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int read() {
int x = 0, f = 1; char ch = getchar();
while (ch < '0' || ch > '9') {if (ch == '-') f = -1; ch = getchar();}
while (ch >= '0' && ch <= '9') {x = (x << 1) + (x << 3) + (ch ^ 48); ch = getchar();}
return x * f;
}
const int N = 110;
int n;
double a[N][N];
int Guass() {
for (int i = 1; i <= n; i++) {
int mx = i;
for (int j = i + 1;j <= n; j++) {
if (fabs(a[mx][i]) < fabs(a[j][i])) mx = j;
}
for (int j = 1; j <= n + 1; j++) swap(a[mx][j], a[i][j]);
if (!a[i][i]) return 0;
for (int j = 1; j <= n; j++) {
if (i != j) {
double d = a[j][i] / a[i][i];
for (int k = i + 1; k <= n + 1; k++) {
a[j][k] -= a[i][k] * d;
}
}
}
}
return 1;
}
int main() {
n = read();
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n + 1; j++) {
a[i][j] = read();
}
}
int f = Guass();
if (!f) printf("No Solution");
else {
for (int i = 1; i <= n; i++) {
printf("%.2lf\n", a[i][n + 1] / a[i][i]);
}
}
return 0;
}

浙公网安备 33010602011771号