Cod sursa(job #1615928)

Utilizator Athena99Anghel Anca Athena99 Data 26 februarie 2016 23:01:16
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb
#include <algorithm>
#include <fstream>
#include <iomanip>

using namespace std;

ifstream fin("gauss.in");
ofstream fout("gauss.out");

const int nmax= 300;
const int out_precision= 10;

int n, m;
double a[nmax+1][nmax+2], sol[nmax+1];

void gauss(  ) {
    for ( int i= 1, j= 1, k; i<=n && j<=m; ++i, ++j ) {
        for ( k= i; k<=n && a[k][j]==0; ++k ) ;
        if ( k<=n ) {
            for ( int l= 1; l<=m+1; ++l ) {
                swap(a[i][l], a[k][l]);
            }

            for ( int l= j+1; l<=m+1; ++l ) {
                a[i][l]= a[i][l]/a[i][j];
            }
            a[i][j]= 1;

            for ( int l= i+1; l<=n; ++l ) {
                for ( int o= j+1; o<=m+1; ++o ) {
                    a[l][o]= a[l][o]-a[l][j]*a[i][o];
                }
                a[l][j]= 0;
            }
        } else {
            --i;
        }
    }
}

int main(  ) {
    fin>>n>>m;
    for ( int i= 1; i<=n; ++i ) {
        for ( int j= 1; j<=m+1; ++j ) {
            fin>>a[i][j];
        }
    }

    gauss();

    for ( int i= n; i>=1; --i ) {
        for ( int j= 1; j<=m+1; ++j ) {
            if ( a[i][j]<-0.000000001 || a[i][j]>0.000000001 ) {
                if ( j==m+1 ) {
                    fout<<"Imposibil\n";
                    return 0;
                }

                sol[j]= a[i][m+1];
                for ( int k= j+1; k<=m; ++k ) {
                    sol[j]= sol[j]-sol[k]*a[i][k];
                }
                j= m+1;
            }
        }
    }

    fout<<setprecision(out_precision)<<fixed;
    for ( int i= 1; i<=m; ++i ) {
        fout<<sol[i]<<" ";
    }
    fout<<"\n";

    return 0;
}