Pagini recente » Infoarena Monthly 2012 - Runda 5, Clasament | Cod sursa (job #16231) | Cod sursa (job #1326214) | Cod sursa (job #2417397) | Cod sursa (job #1642421)
#include <stdio.h>
#include <algorithm>
#define maximnr 310
#define erroare 0.0000001
int nrlin, nrcol;
double mat[maximnr][maximnr];
double X[maximnr];
int i = 1, j = 1, k;
double aux;
int main(){
freopen("gauss.in","r",stdin);
freopen("gauss.out","w",stdout);
scanf("%d %d",&nrlin, &nrcol);
for(int i = 1; i <= nrlin; ++i){
for(int j = 1; j <= nrcol + 1; ++j){
scanf("%lf",&mat[i][j]);
}
}
while(i <= nrlin && j << nrcol){
for(k = i; k <= nrlin; ++k){
if(mat[k][j] <- erroare || mat[k][j] > erroare)
break;
}
if(k == nrlin + 1){
++j;
continue;
}
if(k != i){
for(int x = 1; x <= nrcol + 1; ++x){
std::swap(mat[i][x], mat[k][x]);
}
}
for(int x = j + 1; x <= nrcol + 1; ++x){
mat[i][x] /= mat[i][j];
}
mat[i][j] = 1;
for(int u = i + 1; u <= nrlin; ++u){
for(int l = j + 1; l <= nrcol + 1; ++l){
mat[u][l] -= mat[u][j] * mat[i][l];
}
mat[u][j] = 0;
}
++i;
++j;
}
for(i = nrlin; i > 0; --i){
for(j = 1; j <= nrcol + 1; ++j){
if(mat[i][j] > erroare || mat[i][j] <- erroare){
if(j == nrcol + 1){
printf("Fara solutie");
return 0;
}
X[j] = mat[i][nrcol + 1];
for(k = j + 1; k <= nrcol; ++k){
X[j] -= X[k] * mat[i][k];
}
break;
}
}
}
for(int i = 1; i <= nrcol; ++i){
printf("%.8lf ",X[i]);
}
printf("\n");
return 0;
}