Pagini recente » Cod sursa (job #2585651) | Cod sursa (job #717523)
Cod sursa(job #717523)
#include <cstdio>
#include <algorithm>
using namespace std;
#define MAX 305
#define EPS 0.0000001
int N, M;
double A[MAX][MAX], X[MAX];
bool zero (double), gauss ();
void swap_lines (int, int), input (), output ();
int main () {
input ();
output ();
}
bool gauss () {
int i, j, k, t, p;
for (i = 1, j = 1; i <= N && j <= M; j++) {
for (k = i; k <= N; k++)
if (!zero (A[k][j])) break;
if (k == N + 1) continue;
if (i != k) swap_lines (i, k);
for (t = j + 1; t <= M + 1; t++) A[i][t] /= A[i][j];
A[i][j] = 1;
for (t = i + 1; t <= N; t++) {
for (p = j + 1; p <= M + 1; p++)
A[t][p] -= A[t][j] * A[i][p];
A[t][j] = 0;
}
i++;
}
for (i = N; i > 0; i--)
for (j = 1; j <= M + 1; j++)
if (!zero (A[i][j])) {
if (j == M + 1) return 0;
X[j] = A[i][M + 1];
for (k = j + 1; k <= M; k++)
X[j] -= X[k] * A[i][k];
break;
}
return 1;
}
void swap_lines (int a, int b) {
for (int i = 1; i <= M + 1; i++) swap (A[a][i], A[b][i]);
}
bool zero (double x) {
if (x < 0) x = -x;
if (x < EPS) return 1;
return 0;
}
void input () {
freopen ("gauss.in", "r", stdin);
scanf ("%d %d", &N, &M);
int i, j;
for (i = 1; i <= N; i++)
for (j = 1; j <= M + 1; j++)
scanf ("%lf", &A[i][j]);
}
void output () {
freopen ("gauss.out", "w", stdout);
if (gauss ()) {
for (int i = 1; i <= M; i++)
printf ("%.8lf ", X[i]);
printf ("\n");
}
else printf ("Imposibil\n");
}