Pagini recente » Cod sursa (job #2696235) | Cod sursa (job #3281112) | Cod sursa (job #3160041) | Cod sursa (job #3217647) | Cod sursa (job #2984263)
#include <bits/stdc++.h>
using namespace std;
const int N_MAX = 3e2;
const int M_MAX = 3e2;
const int UNIQUE = 1;
const int NONE = -1;
const double EPS = 1e-7;
const int INF = 1e9;
static inline double myabs (double x) {
if (x < 0)
return -x;
return x;
}
double input[N_MAX][1 + M_MAX], answer[M_MAX];
bool Free[M_MAX];
int gauss__ (int n, int m) {
for (int col = 0; col < m; col ++)
Free[col] = true;
for (int line = 0, col = 0; line < n && col < m; line ++, col ++) {
int chosen = line;
for (int i = line; i < n; i ++)
if (myabs (input[chosen][col]) < myabs (input[i][col]))
chosen = i;
if (myabs (input[chosen][col]) < EPS) /// n-am gasit nicio linie cu coef != 0
continue;
Free[col] = false;
for (int i = col; i <= m; i ++)
swap (input[line][i], input[chosen][i]);
/// (k, i) devine 0 oricare ar fi k != i
for (int i = 0; i < n; i ++) {
if (i != line) {
double k = input[i][col] / input[line][col];
for (int j = col; j <= m; j ++)
input[i][j] -= k * input[line][j];
}
}
}
for (int i = 0; i < m; i ++)
if (!Free[i])
answer[i] = input[i][m] / input[i][i]; /// toti coef sunt 0 in afara de i
bool solution = true;
for (int i = 0; i < n; i ++) {
double sum = 0;
for (int j = 0; j < m; j ++)
sum += answer[j] * input[i][j];
if (myabs (sum - input[i][m]) > EPS)
solution = false;
}
if (solution == true) {
for (int j = 0; j < m; j ++)
if (Free[j]) /// am solutie si poate sa fie ce vrea el
return INF;
return UNIQUE;
}
return NONE;
}
int main()
{
ifstream cin ("gauss.in");
ofstream cout ("gauss.out");
int n, m; cin >> n >> m;
for (int i = 0; i < n; i ++)
for (int j = 0; j <= m; j ++)
cin >> input[i][j];
int counter = gauss__ (n, m);
if (counter != NONE) {
for (int i = 0; i < m; i ++)
cout << fixed << " " << setprecision (10) << answer[i] << " ";
}
else
cout << "Imposibil";
return 0;
}