Cod sursa(job #892365)

Utilizator Theorytheo .c Theory Data 26 februarie 2013 03:06:29
Problema Algoritmul lui Gauss Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.86 kb
#include<fstream>
#include<iomanip>
#include<cstdlib>
#include<cmath>

using namespace std;

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

const double Eps = 0.000000001;
const int Nmax = 310;

double A[Nmax][Nmax]; int P; int N; int M;double Sol[Nmax];double det = 1;

void Read(){

    fin >> N >> M;
    for(int i = 1; i <= N; ++i)
        for(int j = 1; j <= M + 1; j++)
            fin >> A[i][j];
}

void Gauss(){

    int X = 1; int Y = 1;

    while(X <= N && Y <= M){
        int P = -1;
        for(int i = X; i <= N; ++i)
            if(A[i][Y] >Eps || A[i][Y] < -Eps){
                P = i; break;
            }

        if(P == -1){ fout << "Imposibil"; exit(0);}
        if(P != X)
            for(int j = 1; j <= M + 1; ++j)
                swap(A[P][j], A[X][j]);

        double D = A[X][Y];
        for(int j = 1; j <= M + 1; ++j)
            A[X][j] = A[X][j] / D;
        det /= D;

        for(int i = X + 1; i <= N; ++i){
            D = -A[i][Y];
            det *= D;
            for(int j = Y; j <= M + 1; ++j)
                A[i][j] = A[i][j] + D * A[X][j];
        }

        ++X; ++Y;

    }
}

void Solution(){

    for(int i = N; i >= 1 ; --i){
        bool ok = false;
        for(int j = 1; j <= M  ; ++j)
            if(A[i][j] > Eps || A[i][j] < -Eps){

                ok = true;

                Sol[j] = A[i][M + 1];
                for(int k = j + 1; k <= M; ++k)
                    Sol[j] -= Sol[k] * A[i][k];
                break;
            }
        if(ok == false && fabs(A[i][M]) > Eps ){
                fout <<"Imposibil"; exit(0);
            }
    }
    for(int i = 1; i <= M ; ++i)
        fout << fixed << setprecision(8) << Sol[i]<<" ";

}


int main(){

    Read(); Gauss();
    double D = 1;

    fout << det;
    // Solution();
    return 0;
}