Pagini recente » Cod sursa (job #1744657) | Cod sursa (job #3038962) | Cod sursa (job #3230752) | Cod sursa (job #1802094) | Cod sursa (job #1518252)
#include <bits/stdc++.h>
using namespace std;
const double epp = 1e-10;
int main() {
ifstream cin("gauss.in");
ofstream cout("gauss.out");
int N, M; cin >> N >> M;
vector < vector < double >> A(N , vector<double>(M + 1));
for(int i = 0 ; i < N; ++i)
for(int j = 0; j <= M; ++j)
cin >> A[i][j];
for(int currline = 0, currow = 0; currline < N && currow < M;) {
int res = -1;
for(int i = currline; i < N && res == -1; ++i)
if(abs(A[i][currow]) > epp)
res = i;
if(res == -1) {
++currow;
continue;
}
if(res != currline)
for(int j = 0 ; j <= M; ++j)
swap(A[res][j], A[currline][j]); // swap lines
for(int j = currow + 1 ; j <= M; ++j)
A[currline][j] /= A[currline][currow];
A[currline][currow] = 1; // make the coefficient to 1
for(int i = currline + 1; i < N; ++i) {
for(int j = currow + 1; j <= M; ++j)
A[i][j] -= A[i][currow] * A[currline][j];
A[i][currow] = 0;
}
currline++; currow++;
}
vector<double> ret(M);
for(int i = N - 1; i >= 0; --i)
for(int j = 0; j <= M; ++j)
if(abs(A[i][j]) > epp) {
if(j == M) {
cout << "Imposibil";
return 0;
}
ret[j] = A[i][M];
for(int k = j + 1; k <= M; ++k)
ret[j] -= ret[k] * A[i][k];
break;
}
cout << fixed << setprecision(10);
for(auto it : ret)
cout << it << ' ';
return 0;
}