Pagini recente » Cod sursa (job #1753667) | Cod sursa (job #109208) | Cod sursa (job #533205) | Cod sursa (job #722290) | Cod sursa (job #1414660)
#include <fstream>
#include <cstdio>
using namespace std;
const int MAX_N = 305;
const double EPS = 0.00000001;
int N, M;
double A[MAX_N][MAX_N], x[MAX_N];
inline int double_cmp(double a, double b) {
if(a - b < -EPS) {
return - 1;
}
if(a - b > EPS) {
return 1;
}
return 0;
}
int main() {
freopen("gauss.in", "r", stdin);
freopen("gauss.out", "w", stdout);
scanf("%d %d", &N, &M);
for(int i = 1; i <= N; ++i) {
for(int j = 1; j <= M + 1; ++j) {
scanf("%lf", &A[i][j]);
}
}
int i = 1, j = 1;
while(i <= N && j <= M) {
int x = 0;
for(int k = i; k <= N; ++k) {
if(double_cmp(A[k][j], 0) != 0) {
x = k;
k = N;
}
}
if(x == 0) {
++j;
continue;
}
for(int h = 1; h <= M + 1; ++h) {
swap(A[i][h], A[x][h]);
}
double tmp = A[i][j];
for(int h = j; h <= M + 1; ++h) {
A[i][h] /= tmp;
}
for(int k = i + 1; k <= N; ++k) {
tmp = A[k][j];
for(int h = j; h <= M + 1; ++h) {
A[k][h] -= A[i][h] * tmp;
}
}
++i; ++j;
}
bool haveSol = 1;
for(int i = N; i >= 1; --i) {
bool ok = 0;
for(int j = 1; j <= M && !ok; ++j) {
if(double_cmp(A[i][j], 0)) {
ok = 1;
double tmp = A[i][M + 1];
for(int h = j + 1; h <= M; ++h) {
tmp -= x[h] * A[i][h];
}
x[j] = tmp;
}
}
if(!ok && double_cmp(A[i][M + 1], 0)) {
haveSol = 0;
break;
}
}
if(haveSol) {
for(int i = 1; i <= M; ++i) {
printf("%.10lf ", x[i]);
}
printf("\n");
}
else printf("Imposibil\n");
fclose(stdin);
fclose(stdout);
return 0;
}