Pagini recente » Cod sursa (job #2984652) | Cod sursa (job #2459828) | Cod sursa (job #3288143) | Cod sursa (job #2984713) | Cod sursa (job #2910580)
#include <fstream>
#include <vector>
#include <iomanip>
using namespace std;
const double EPS = 1e-9;
bool gauss(vector<vector<double>>& a, vector<double>& ans) {
auto isNull = [](double x) {
return abs(x) <= EPS;
};
int nl = a.size();
int nc = a[0].size();
vector<int> row(nc - 1, -1);
int i = 0, j = 0;
while (i < nl && j < nc - 1) {
int piv = i;
for (int i2 = i; i2 < nl; ++i2) {
if (a[i2][j] > a[piv][j]) {
piv = i2;
}
}
if (isNull(a[piv][j])) {
++j;
continue;
}
row[j] = i;
for (int j2 = j; j2 < nc; ++j2) {
swap(a[i][j2], a[piv][j2]);
}
for (int i2 = 0; i2 < nl; ++i2) {
if (i2 == i) {
continue;
}
double c = a[i2][j] / a[i][j];
for (int j2 = j; j2 < nc; ++j2) {
a[i2][j2] -= a[i][j2] * c;
}
}
++i, ++j;
}
ans.assign(nc - 1, 0);
for (j = 0; j < nc - 1; ++j) {
if (row[j] != -1) {
if (!isNull(a[row[j]][nc - 1]) && isNull(a[row[j]][j])) {
return false;
}
ans[j] = a[row[j]][nc - 1] / a[row[j]][j];
}
}
return true;
}
int main() {
ifstream cin("gauss.in");
ofstream cout("gauss.out");
int nl, nc;
cin >> nl >> nc;
++nc;
vector<vector<double>> a(nl, vector<double>(nc));
for (int i = 0; i < nl; ++i) {
for (int j = 0; j < nc; ++j) {
cin >> a[i][j];
}
}
cin.close();
vector<double> ans;
if (gauss(a, ans)) {
for (auto i: ans) {
cout << fixed << setprecision(10) << i << " ";
}
} else {
cout << "Imposibil";
}
cout.close();
return 0;
}