Pagini recente » Cod sursa (job #1851687) | Cod sursa (job #1369836) | Cod sursa (job #3226495) | Cod sursa (job #1244726) | Cod sursa (job #1264696)
#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;) {
if(eq(A[i][j],0.0)) {
for(int t = i + 1; t < n;t++) {
if(!eq(A[t][j],0.0)) {
for(int k = 0; k < m + 1; k ++) {
ld tmp = A[t][k];
A[t][k] = A[i][k];
A[i][k] = tmp;
}
break;
}
}
}
if(!eq(A[i][j],0.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[i][j];
}
A[t][j] = 0.0;
}
for(int k = j + 1; k < m + 1;k ++) {
A[i][k] /= A[i][j];
}
A[i][j] = 1.0;
i++; j++;
}
else {
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;
}