Cod sursa(job #685721)

Utilizator david_raucaRauca Ioan David david_rauca Data 21 februarie 2012 09:28:11
Problema Algoritmul lui Gauss Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 2.68 kb
#include<fstream>
#include<iomanip>
using namespace std;

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

#define eps 0.000000001

int n, m;
double a[310][310];
double sol[310];               // sirul solutiilor

void Read();                //Functia de citire
void Gauss();               //Algoritmul lui Gauss
void Nec();                 //Calculeaza necunoscutele si le afiseaza

int main()
{
    Read();
    Gauss();
    Nec();
    
    fin.close();
    fout.close();
    
    return 0;
}

//Citire

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

// Gauss
void Gauss()
{
    int i = 1, j = 1, k;
    double aux;
    
    while( i <= n && j <= m )
    {
        // caut o linie pe care coeficientul a[k][j] este != 0
        for( k = i; k <= n; ++k )
            if( a[k][j] > eps || a[k][j] < -eps )
                break;
        
        if( k == n+1 )          // daca nu gasim coeficient diferit de 0 trecem la urmatoarea coloana
        {
            j++;
            continue;
        }
        
        if( k != i )                                // interschimbam liniile daca este cazul
        {
            for( int l = 1; l <= m+1; ++l )
            {
                aux = a[k][l];
                a[k][l] = a[i][l];
                a[i][l] = aux;
            }
        }
        
        for( int l = j + 1; l <= m+1; ++l )          // impartim lunia la coef != 0...=> a[i][j] = 1;
            a[i][l] /= a[i][j];
        a[i][j] = 1;
        
        for( int u = i + 1; u <= n; ++u )                   // inmultim linia u cu a[i][l] cu a[u][j] si o scadem astfel sub a[i][j] vom avea 0; 
        {
            for( int l = j + 1; l <= m+1; ++l )
                a[u][l] = (a[u][j] * a[i][l]) - a[u][l];
            a[u][j] = 0;
        }
        
        i++;
        j++;
    } 
    /*
    for( i = 1; i <= n; ++i )
    {
        for( j = 1; j <= m+1; ++j )
            fout << a[i][j] << ' ';
        fout << '\n';
    } 
    */
}

void Nec()
{
    int i, j;
    
    for( i = n; i >= 1; --i )
        for( j = 1; j <= m+1; ++j )
            if( a[i][j] > eps || a[i][j] < -eps )
            {
                if( j == m+1 )
                {
                    fout << "Imposibil" << '\n';
                    return;
                }
                
                sol[j] = a[i][m+1];
                for( int l = j + 1; l <= m; ++l )
                    sol[j] = sol[j] - ( a[i][l] * sol[l] );
                break;
            }
    
    for( i = 1; i <= m; ++i )
        fout << sol[i] << ' ';
}