Pagini recente » Cod sursa (job #2264631) | Cod sursa (job #816079) | Cod sursa (job #1666692) | Cod sursa (job #1096974) | Cod sursa (job #2487299)
#include <fstream>
#define dif 0.0000000001
#include <iomanip>
using namespace std;
ifstream fin("gauss.in");
ofstream fout("gauss.out");
int n, m, i, j, k, coef, t, h, sol;
double a[306][306], eps, x[305];
int main(){
fin>>n>>m;
for(i=1;i<=n;i++)
for(j=1;j<=m+1;j++)
fin>>a[i][j];
i = 1, j = 1;
while(i<=n && j<=m){
k = 0;
for(t=i;t<=n;t++) /// pornesc din pozitia curenta(i,j) si merg pe coloana in jos, cautand sa vad daca toti coeficientii sunt nuli, ceea ce inseamna ca variabila j este libera
if(a[t][j] != 0){
k = t;
break;
}
if(k == n+1){
j++;
continue; /// nu am gasit niciun coefient nenul => variabila j este libera
}
if(k != i) /// coeficientul curent este zero, deci trebuie schimbata ecuatia curenta cu alta
/// schimb liniile i si k
for(t=1;t<=m+1;t++)
swap(a[i][t], a[k][t]);
/// acum sunt in elementul (i, j) si stiu sigur ca acesta este nenul
/// trebuie sa fac zero sub el
/// mai intai, il fac egal cu unu
for(t=j+1; t<=m+1; t++)
a[i][t] /= a[i][j];
a[i][j] = 1;
/// abia acum fac zero sub el
for(t=i+1; t<=n; t++){
for(h=j+1;h<=m+1;h++)
a[t][h] -= a[t][j]*a[i][h];
a[t][j] = 0;
}
i++;
j++; /// ma deplasez pe diagonala in jos
}
/// acum REZOLV SISTEMUL
/// pornind de la ultima ecuatie
for(i=n;i>0;i--){
/// caut primul coeficient diferit de zero
coef = 0;
for(j=1;j<=m+1;j++)
if(-eps > a[i][j] || a[i][j] > eps){
coef = j;
break;
}
if(coef == m+2){ /// toti coeficientii sunt zero, deci ecuatia are o infinitate de solutii
continue;
}
if(coef == m+1){
sol = -1;
break;
}
/// acum sunt in cazul in care am gasit un coeficient al unei variabile diferit de zero
/// pot calcula variabila de pe pozitia (i, coef)
x[coef] = a[i][m+1]/a[i][coef];
/// acum il scad din toate ecuatiile de dinainte
for(h=i-1;h>0;h--)
a[h][m+1] -= x[coef]*a[h][coef];
}
if(sol == -1)
fout<<"Imposibil";
else{
for(j=1;j<=m;j++)
fout<<setprecision(10)<<fixed<<x[j]<<" ";
}
return 0;
}