Pagini recente » Cod sursa (job #2840640) | Cod sursa (job #3209184) | Cod sursa (job #1213874) | Cod sursa (job #1726314) | Cod sursa (job #1964057)
#include <bits/stdc++.h>
using namespace std;
const int kMaxN = 300;
const int kMaxM = 300;
const double kPrecision = 1e-15;
double A[kMaxN + 1][kMaxM + 1], x[kMaxM + 1], b[kMaxN + 1];
bool is_zero(double x)
{
return abs(x) < kPrecision;
}
int main()
{
freopen("gauss.in", "rt", stdin);
freopen("gauss.out", "wt", stdout);
int n, m;
scanf("%d %d", &n, &m);
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) scanf("%lf", &A[i][j]);
scanf("%lf", &b[i]);
}
for (int i = 1, j = 1; i <= n && j <= m; ++i, ++j) {
if (A[i][j] == 0) {
int k;
for (k = i + 1; k <= n; ++k) {
if (A[k][j] != 0) break;
}
if (k > n) {
--i; // stay on same line
continue;
}
for (int p = j; p <= m; ++p) swap(A[k][p], A[i][p]);
swap(b[i], b[k]);
}
for (int k = i + 1; k <= n; ++k) {
double ratio = A[k][j] / A[i][j];
for (int p = j; p <= m; ++p) A[k][p] -= ratio * A[i][p];
b[k] -= ratio * b[i];
}
}
/* for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) printf("%lf ", A[i][j]);
printf("%lf\n", b[i]);
} */
for (int i = n; i >= 1; --i) {
int j;
for (j = 1; j <= m; ++j) {
if (!is_zero(A[i][j])) break;
}
if (j > m && !is_zero(b[i])) {
printf("Imposibil\n");
return 0;
}
double sum = 0;
for (int k = j + 1; k <= m; ++k) sum += A[i][k] * x[k];
x[j] = (b[i] - sum) / A[i][j];
}
for (int j = 1; j <= m; ++j) printf("%.10lf ", x[j]);
printf("\n");
return 0;
}