Pagini recente » Cod sursa (job #549683) | Cod sursa (job #2599147) | Cod sursa (job #2679669) | Cod sursa (job #697406) | Cod sursa (job #1708791)
#include <cstdio>
#include <cmath>
#include <algorithm>
#define NMax 310
using namespace std;
int N, M;
double a[NMax][NMax];
double x[NMax];
bool sol = true;
bool zero( double val ) {
return fabs(val) < 0.1;
}
void gauss() {
if (N < M) {
sol = false;
return;
}
int imax = min(N, M);
for ( int i = 1; i <= imax; ++ i ) {
int max_k = i;
double max_val = 0;
for ( int k = i; k <= N; ++ k ) {
if ( fabs(a[k][i]) > max_val ) {
max_k = k;
max_val = fabs(a[k][i]);
}
}
if ( i != max_k ) {
for ( int k = 1; k <= M + 1; ++ k) {
swap(a[i][k], a[max_k][k]);
}
}
double x = a[i][i];
for ( int k = i + 1; k <= N; ++ k ){
double y = a[k][i];
for ( int j = i; j <= M + 1; ++ j ) {
a[k][j] = a[k][j] - a[i][j] * y / x;
}
a[k][i] = 0;
}
}
// for (int i = 1; i <= M; ++i) {
// for (int j = 1 ; j <= M; ++j) {
// if (j < i) {
// printf("%.10f ", 0);
// } else {
// printf("%.10f ", a[i][j]);
// }
// }
// printf("\n");
// }
for (int i = M; i >= 0; --i) {
double s = 0;
for (int k = i + 1; k <= M; ++k) {
s += a[i][k] * x[k];
}
x[ i ] = 1.0 * (a[i][M + 1] - s) / a[i][i];
}
}
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]);
gauss();
if ( ! sol ) {
printf("Imposibil\n");
return 0;
}
for ( int i = 1; i <= M; ++ i )
printf("%.10lf ", x[i]);
printf("\n");
return 0;
}