Cod sursa(job #1142972)

Utilizator oprea1si2si3Oprea Sebastian oprea1si2si3 Data 14 martie 2014 14:40:14
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.82 kb
#include<fstream>
#include<iostream>
#include<iomanip>
#define EPS 0.0000001
using namespace std;

int N,M,ok;
double Msistem[305][305],sol[305];

void citire() {

    ifstream in("gauss.in");
    int i,j;
    in>>N>>M;
    for(i=1;i<=N;++i)
        for(j=1;j<=M+1;++j)
            in>>Msistem[i][j];
    in.close();

}

void solve() {

    int i=1,j=1,k,l,u;
    double aux;

    while(i<=N&&j<=M) {
        for(k=i;k<=N;++k)
            if(Msistem[k][j]<-EPS || Msistem[k][j]>EPS)
                break;


        if(k==N+1) {
            ++j;
            continue;
        }

        if(k!=i)
            for(l=1;l<=M+1;++l) {
                aux=Msistem[i][l];
                Msistem[i][l]=Msistem[k][l];
                Msistem[k][l]=aux;
            }

        for(l=j+1;l<=M+1;++l)
            Msistem[i][l]=Msistem[i][l]/Msistem[i][j];
        Msistem[i][j]=1;

        for(u=i+1;u<=N;++u) {
            for(l=j+1;l<=M+1;++l)
                Msistem[u][l]-=Msistem[u][j]*Msistem[i][l];
            Msistem[u][j]=0;
        }
        ++i;
        ++j;
    }

     for(i=N;i>0;--i)
        for(j=1;j<=M+1;++j)
            if(Msistem[i][j]>EPS||Msistem[i][j]<(-EPS)) {
                if(j==M+1) {
                    ok=1;
                    return;
                }
                sol[j]=Msistem[i][M+1];
                for(u=j+1;u<=M;++u)
                    sol[j]-=sol[u]*Msistem[i][u];
                break;
            }

}

void afisare() {

    ofstream out ("gauss.out");
    int i;
    if(ok==1)
        out<<"Imposibil"<<'\n';
    else {
        for(i=1;i<=M;++i)
            out<<fixed<<setprecision(8)<<sol[i]<<' ';
        out<<'\n';
    }
    out.close();

}


int main() {

    citire();
    solve();
    afisare();
    return 0;

}