Pagini recente » Cod sursa (job #1800589) | Cod sursa (job #511384) | Borderou de evaluare (job #1170904) | Borderou de evaluare (job #104310) | Cod sursa (job #2182405)
#include <cstdio>
#include <fstream>
#include <cmath>
#include <iomanip>
#define NMAX 303
#define ld long double
#define E 0.000000001
using namespace std;
ifstream f("gauss.in");
ofstream g("gauss.out");
int n, m, k;
double M[NMAX][NMAX];
double rez[NMAX];
void change(int a, int b, int c)
{
for (int i=c; i<=m+1; ++i)
swap(M[a][i], M[b][i]);
}
void divide(int a, ld b, int c)
{
for (int i=c; i<=m+1; ++i)
M[a][i] /= b;
}
void sub(int a, int b, ld c, int d)
{
for (int i=d; i<=m+1; ++i)
M[a][i] -= M[b][i] * c;
}
int main()
{
f>>n>>m;
for (int i=1; i<=n; ++i)
for (int j=1; j<=m+1; ++j)
f>>M[i][j];
k = 1;
for (int j=1; j<=m; ++j) {
if (abs(M[k][j]) < E)
for (int i=k; i<=n; ++i)
if (abs(M[i][j]) > E) {
change(i, k, j);
break;
}
if (abs(M[k][j]) < E) continue;
divide(k, M[k][j], j);
for (int i=k+1; i<=n; ++i)
sub(i, k, M[i][j], j);
++k;
}
for (int i=n; i>=1; i--) {
int sav = -1;
for (int j=1; j<=m; ++j) {
if (abs(M[i][j]) > E) {
sav = j;
break;
}
}
if (sav==-1 && abs(M[i][m+1]) > E) {
g<<"Imposibil\n";
return 0;
}
for (int j=sav+1; j<=m; ++j)
M[i][m+1] -= rez[j] * M[i][j];
rez[sav] = M[i][m+1];
}
for (int i=1; i<=m; ++i)
g<<fixed<<setprecision(10)<<rez[i]<<' ';
return 0;
}