#include <bits/stdc++.h>
using namespace std;
inline long long read() {
char ch = getchar();
long long f = 1,x = 0;
while (ch > '9' || ch < '0') { if (ch == '-')f = -1; ch = getchar(); }
while (ch >= '0' && ch <= '9') { x = (x << 1) + (x << 3) + ch - '0'; ch = getchar(); }
return x * f;
}
//void ReadFile() {
// FILE* stream1;
// freopen_s(&stream1,"in.txt", "r", stdin);
// freopen_s(&stream1,"out.txt", "w", stdout);
//}
static auto speedup = []() {ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); return nullptr; }();
class Guess {
public:
const double eps = 1e-10;
Guess(int _n) {
n = _n;
data.assign(n, vector<double>(n + 1));
}
void input() {
for (int i = 0; i < n; i++) {
for (int j = 0; j <= n; j++) {
cin >> data[i][j];
}
}
}
int slove() {
int line = 0;
for (int i = 0; i < n; i++) {
int maxIdx = line;
for (int j = line; j < n; j++) {
if (fabs(data[j][i]) > fabs(data[maxIdx][i])) {
maxIdx = j;
}
}
//找最大系数
if (fabs(data[maxIdx][i]) < eps)continue;
swap(data[maxIdx], data[line]);
for (int j = 0; j < n; j++) {
if (j == line)continue;
double mul = data[j][i] / data[line][i];
for (int k = n; k >= line; k--) {
data[j][k] -= data[line][k] * mul;
}
}
line++;
}
//line不是n,就不是唯一解
if (line < n) {
for (int i = line; i < n; i++)
if (fabs(data[i][n]) > eps)
return 2; //无解, 0 = !0)
return 1; //无穷多组解 0 = 0
}
return 0; //唯一解
}
void output() {
for (int i = 0; i < n; i++) {
cout << "x" << i + 1 << "=";
cout << fixed << setprecision(2) << data[i][n] / data[i][i] << endl;
}
}
vector<vector<double>> data;
int n;
};
int main() {
int n;
cin >> n;
Guess gs(n);
gs.input();
int ret = gs.slove();
if (ret == 0) {
gs.output();
}
else if (ret == 1) {
cout << "0" << endl;
}
else cout << "-1" << endl;
return 0;
}
高斯消元练习
最新推荐文章于 2024-06-02 15:09:13 发布