Pagini recente » Cod sursa (job #485348) | Cod sursa (job #2808240) | Cod sursa (job #2427187) | Cod sursa (job #1028127) | Cod sursa (job #650602)
Cod sursa(job #650602)
/*
Pt fiecare coloana i las elem de pe linia i nevid si adun si scad linia i la celelalte linii pt a face 0 restul elem
de pe coloana j. Coloanele precedente nu se strica deoarece elem lor de pe linia de lucru i este 0.
*/
#include <cstdio>
#include <cmath>
const int N = 305;
const int M = 305;
const double EPS = 1e-10;
int n, m;
double a[N][M];
double x[M]; //solutii
int p;
void citire()
{
scanf("%d%d",&n,&m);
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= m+1; ++j)
scanf("%lf",&a[i][j]);
}
void interschimba_linie(int i1, int i2)
{
double aux;
for (int j = 1; j <= m+1; ++j)
{
aux = a[i1][j];
a[i1][j] = a[i2][j];
a[i2][j] = aux;
}
}
void aduna_linie(int i1, int i2, double k)
{
for (int j = 1; j <= m+1; ++j)
a[i1][j] += k * a[i2][j];
}
void gauss()
{
p = 1;//elem de pe coloana curenta care il consider nevid.
for (int j = 1; j <= m; ++j)
{
if (a[p][j] == 0)
{
int i;
for (i = p+1; i <= n;++i)
if (a[i][j] != 0)
{
interschimba_linie(p,i);
break;
}
if (i > n)
continue;
}
for (int i = 1; i <= n; ++i)
{
if (i == p)
continue;
aduna_linie(i,p,-a[i][j]/a[p][j]);
}
++p;
}
}
void calculare_solutii()
{
for (int i = p; i <= n; ++i)
{
int j;
for (j = 1; j <= m; ++j) //verificare linii goale
if (fabs(a[i][j]) > EPS)
break;
if (j > m && fabs(a[i][m+1]) > EPS)
{
printf("imposibil");
return;
}
}
for (int i = 1; i <= p-1; ++i)
for (int j = 1; j <= m; ++j)
if (fabs(a[i][j]) > EPS)
{
x[j] = a[i][m+1]/a[i][j];
break;
}
for (int j = 1; j <= m; ++j)
printf("%lf ",x[j]);
}
int main()
{
freopen("gauss.in","r",stdin);
freopen("gauss.out","w",stdout);
citire();
gauss();
calculare_solutii();
return 0;
}