Pagini recente » Cod sursa (job #1441963) | Borderou de evaluare (job #2107029) | Cod sursa (job #847408) | Cod sursa (job #1538592) | Cod sursa (job #1414016)
#include<fstream>
#include<vector>
#include<cmath>
#include<iomanip>
using namespace std;
typedef int var;
ifstream fin("gauss.in");
ofstream fout("gauss.out");
#define MAXN 500
#define eps 1e-8
#define eq(a, b) (fabs(a-b)<eps)
var m, n;
double **A, **B;
double *X;
void read() {
fin>>n>>m;
A = new double*[n+1];
B = new double*[n+1];
X = new double[n+1];
for(var i=1; i<=n; i++) {
A[i] = new double[m+2];
B[i] = new double[m+2];
}
for(var i=1; i<=n; i++) {
for(var j=1; j<=m+1; j++) {
fin>>A[i][j];
B[i][j] = A[i][j];
}
}
}
bool diag() {
for(var step=1; step<=n; step++) {
if(eq(B[step][step], 0)) {
var i;
for(i=step+1; i<=n && eq(B[i][step], 0); i++);
if(i > n) return false;
swap(B[i], B[step]);
}
for(var i=step+1; i<=m+1; i++) {
B[step][i] /= B[step][step];
}
B[step][step] = 1;
B[step][step] = 1;
for(var i=step+1; i<=n; i++) {
var inm = B[i][step];
for(var j=step; j<=m+1; j++) {
B[i][j] -= B[step][j] * inm;
}
}
}
return true;
}
void findX() {
for(var i=n; i>=1; i--) {
double rez = B[i][m+1];
for(var j=m; j>i; j--) {
rez -= B[i][j]*X[j];
}
X[i] = rez;
}
}
int main() {
read();
if(!diag()) {
fout<<-1;
return 0;
}
findX();
for(var i=1; i<=n; i++) {
double rez = 0;
for(var j=1; j<=m; j++) {
rez += A[i][j] * X[j];
}
if(!eq(rez, A[i][m+1])) {
fout<<-1;
return 0;
}
}
fout<<fixed<<setprecision(10);
for(var i=1; i<=n; i++) {
fout<<X[i]<<" ";
}
return 0;
}