Pagini recente » Cod sursa (job #1731193) | Cod sursa (job #1870861) | Cod sursa (job #1417809) | Cod sursa (job #3122508) | Cod sursa (job #2471913)
#include <fstream>
#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
ifstream fin("gauss.in");
ofstream fout("gauss.out");
double a[305][305];
double x[305];
int n, m;
void citire() {
fin >> n >> m;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m + 1; ++j) {
fin >> a[i][j];
}
}
}
void swapRows(int index1, int index2) {
int aux;
for (int j = 0; j < m + 1; ++j) {
aux = a[index1][j];
a[index1][j] = a[index2][j];
a[index2][j] = aux;
}
}
bool double_equals(double a, double b, double epsilon = 0.00000000001)
{
return abs(a - b) < epsilon;
}
void gaussAlgorithm() {
int i = 0, j = 0;
while (i < n && j < m) {
int iNenul = i;
while (iNenul < n && double_equals(a[iNenul][j], 0)) {
++iNenul;
}
if (iNenul == n) {
++j;
}
else {
if (iNenul != i)
swapRows(iNenul, i);
for (int k = i + 1; k < n; ++k) {
double r = a[k][j] /a[i][j];
a[k][j] = 0;
for (int l = j + 1; l <= m; ++l) {
a[k][l] = a[k][l] - a[i][l] * r;
}
}
i++;
j++;
}
}
}
void afisare() {
fout << fixed << setprecision(10);
for (int i = 0; i < m; ++i) {
fout << x[i] << " ";
}
}
void getUnknownValues() {
for (int i = n - 1; i >= 0; --i) {
int jNenul = 0;
while (jNenul < m && double_equals(a[i][jNenul], 0)) {
++jNenul;
}
if (jNenul == m && !double_equals(a[i][m], 0)) {
fout << "Imposibil\n";
return;
}
for (int j = jNenul + 1; j < m; ++j) {
a[i][m] -= x[j] * a[i][j];
}
x[jNenul] = a[i][m] / a[i][jNenul];
}
afisare();
}
int main()
{
citire();
gaussAlgorithm();
getUnknownValues();
return 0;
}