Pagini recente » Cod sursa (job #1387792) | Cod sursa (job #257750) | Cod sursa (job #1104742) | Cod sursa (job #3134029) | Cod sursa (job #2398494)
#include <cstdio>
#include <algorithm>
#define epsi 0.0000000001
using namespace std;
double coef[500][500];
double valori[500];
int N, M;
void imparte_linia_i(int i, int j)
{
double ca_sa_fie_1 = coef[i][j];
for(int c=1; c<=M+1; c++)
coef[i][c] = coef[i][c] / ca_sa_fie_1;
}
void elimin_lit(int i, int nr, int i_init)
{
for(int j=1; j<=M+1; j++)
coef[i][j] += coef[i_init][j] * nr;
}
void rezolva_linia(int k, int j)
{
int i;
for(i=k; i<=N; i++)
{
double aux;
if(coef[i][j] < 0)
aux = coef[i][j] * (-1);
else aux = coef[i][j];
if(coef[i][j] - epsi > 0)
break;
}
if(i == N + 1)
return;
swap(coef[i], coef[k]);
imparte_linia_i(i, j);
for(int linie = i+1; linie <= N; linie ++)
elimin_lit(linie, coef[linie][j] * (-1), i);
}
/**
x+y+z = 3
2z+2y+z = 5
-----
z = 1
x = 1
y = 1
**/
void raspuns_final()
{
if(N == M)
{
valori[N] = coef[N][M+1]/coef[N][M];
for(int i=N-1; i>=1; i--)
{
double rez = coef[i][M+1];
for(int j=i+1; j<=N; j++)
rez -= coef[i][j] * valori[j];
valori[i] = rez / coef[i][i];
}
for(int i=1; i<=M; i++)
printf("%.8f ", valori[i]);
}
if(N > M) /// rezolv primele N, verif celelalte;
{
valori[M] = coef[M][M+1]/coef[M][M];
for(int i=M-1; i>=1; i--)
{
double rez = coef[i][M+1];
for(int j=i+1; j<=M; j++)
rez -= coef[i][j] * valori[j];
valori[i] = rez / coef[i][i];
}
bool ok = 0;
for(int i=M+1; i<=N; i++)
{
double rez = 0;
for(int j=1; j<=M; j++)
{
double inm = coef[i][j] * valori[j];
rez += inm;
}
if(coef[i][M+1] != rez) {printf("Imposibil"); ok = 1;}
}
if(ok == 0)
for(int i=1; i<=M; i++)
printf("%.8f ", valori[i]);
}
if(N < M)
{
valori[M] = coef[N][M+1]/coef[N][M];
bool ok=0;
for(int i=N-1; i>=1; i--)
{
double rez = coef[i][M+1];
for(int j=i+1; j<=N; j++)
{
rez -= coef[i][j] * valori[j];
if(coef[i][j] != 0)
ok = 1;
}
if(ok == 0)
{printf("Imposibil"); return;}
ok = 0;
valori[i] = rez / coef[i][i];
}
for(int i=1; i<=M; i++)
printf("%.8f ", valori[i]);
}
}
int main()
{
freopen("gauss.in", "r", stdin);
freopen("gauss.out", "w", stdout);
scanf("%d %d", &N, &M);///N linii M+1 intregi
for(int i=1; i<=N; i++)
for(int j=1; j<=M+1; j++)
scanf("%lf", &coef[i][j]);
for(int i=1; i<=min(N, M-1); i++)
rezolva_linia(i, i);
raspuns_final();
return 0;
}