Cod sursa(job #892351)

Utilizator Theorytheo .c Theory Data 26 februarie 2013 02:28:16
Problema Algoritmul lui Gauss Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.72 kb
#include<fstream>
#include<iomanip>
#include<cstdlib>
#include<cmath>

using namespace std;

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

const double Eps = 0.00000000000001;
const int Nmax = 303;

double A[Nmax][Nmax]; int P; int N; int M;double Sol[Nmax];

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(fabs(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;


        for(int i = X + 1; i <= N; ++i){
            D = -A[i][Y];
            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(fabs(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){
                fout <<"Imposibil"; exit(0);
            }
    }
    for(int i = 1; i <= M ; ++i)
        fout << fixed << setprecision(8) << Sol[i]<<" ";

}


int main(){

    Read(); Gauss(); Solution();
    return 0;
}