Pagini recente » Cod sursa (job #458464) | Cod sursa (job #1971873) | Cod sursa (job #1610009) | Cod sursa (job #1814624) | Cod sursa (job #1264703)
#include <fstream>
#include <cmath>
#include <cstring>
#include <iomanip>
typedef double ld;
const ld EPS = 1e-10;
bool eq(ld a, ld b) {
return fabs(a - b) < EPS || fabs(a - b) < fabs(a) * EPS || fabs(a - b) < fabs(b) * EPS;
}
int main() {
std::ifstream f("gauss.in",std::ios::in);
std::ofstream g("gauss.out",std::ios::out);
int n,m;
f >> n >> m;
const int SIZ = 300;
ld A[SIZ + 1][SIZ + 2];
memset(A,0,sizeof A);
for(int i = 0; i < n ; i++)
for(int j = 0; j < m + 1; j++)
f >> A[i][j];
for(int i = 0, j = 0; i < n && j < m;) {
int t = i;
for(; t < n && eq(A[t][j],0.0);t++);
if(t == n) {
j ++;
continue;
}
for(int k = 0; k < m + 1; k ++) {
ld tmp = A[t][k];
A[t][k] = A[i][k];
A[i][k] = tmp;
}
for(int k = j + 1; k < m + 1;k ++) {
A[i][k] /= A[i][j];
}
A[i][j] = 1.0;
for(int t = i + 1; t < n; t++) {
for(int k = j + 1; k < m + 1;k ++) {
A[t][k] -= A[t][j] * A[i][k];
}
A[t][j] = 0.0;
}
i ++; j ++;
}
ld x[SIZ];
memset(x,0, sizeof x);
g << std::fixed << std::setprecision(8);
for(int i = n - 1; i >= 0; i -- ) {
int j = 0;
for(;j <= m && eq(A[i][j],0); j++);
if(j == m) {
g << "Imposibil" << std::endl;
return 0;
}
if(j < m) {
x[j] = A[i][m];
for(int k = j + 1; k < m; k++) {
x[j] -= A[i][k] * x[k];
}
}
}
for(int i = 0; i < m;i++) {
g << x[i] << ' ';
}
g << std::endl;
return 0;
}