Cod sursa(job #2398494)

Utilizator Mirela_MagdalenaCatrina Mirela Mirela_Magdalena Data 5 aprilie 2019 16:37:09
Problema Algoritmul lui Gauss Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.03 kb
#include <cstdio>
#include <algorithm>
#define epsi 0.0000000001
using namespace std;

double coef[500][500];
double valori[500];
int N, M;

void imparte_linia_i(int i, int j)
{
    double ca_sa_fie_1 = coef[i][j];
    for(int c=1; c<=M+1; c++)
        coef[i][c] = coef[i][c] / ca_sa_fie_1;
}

void elimin_lit(int i, int nr, int i_init)
{
    for(int j=1; j<=M+1; j++)
        coef[i][j] += coef[i_init][j] * nr;
}




void rezolva_linia(int k, int j)
{
    int i;
    for(i=k; i<=N; i++)
    {
        double aux;
        if(coef[i][j] < 0)
            aux = coef[i][j] * (-1);
        else aux = coef[i][j];
        if(coef[i][j] - epsi > 0)
            break;
    }
    if(i == N + 1)
        return;
    swap(coef[i], coef[k]);
    imparte_linia_i(i, j);
    for(int linie = i+1; linie <= N; linie ++)
        elimin_lit(linie, coef[linie][j] * (-1), i);
}


/**
x+y+z = 3
2z+2y+z = 5
-----
z = 1
x = 1
y = 1



**/


void raspuns_final()
{
    if(N == M)
    {
        valori[N] = coef[N][M+1]/coef[N][M];
        for(int i=N-1; i>=1; i--)
        {
            double rez = coef[i][M+1];
            for(int j=i+1; j<=N; j++)
                rez -= coef[i][j] * valori[j];
            valori[i] = rez / coef[i][i];
        }
        for(int i=1; i<=M; i++)
            printf("%.8f ", valori[i]);
    }
    if(N > M) /// rezolv primele N, verif celelalte;
    {
        valori[M] = coef[M][M+1]/coef[M][M];
        for(int i=M-1; i>=1; i--)
        {
            double rez = coef[i][M+1];
            for(int j=i+1; j<=M; j++)
                rez -= coef[i][j] * valori[j];
            valori[i] = rez / coef[i][i];
        }
        bool ok = 0;
        for(int i=M+1; i<=N; i++)
        {
            double rez = 0;
            for(int j=1; j<=M; j++)
            {
                double inm = coef[i][j] * valori[j];
                rez += inm;
            }
            if(coef[i][M+1] != rez) {printf("Imposibil"); ok = 1;}
        }
        if(ok == 0)
            for(int i=1; i<=M; i++)
                printf("%.8f ", valori[i]);
    }
    if(N < M)
    {
        valori[M] = coef[N][M+1]/coef[N][M];
        bool ok=0;
        for(int i=N-1; i>=1; i--)
        {
            double rez = coef[i][M+1];
            for(int j=i+1; j<=N; j++)
            {
                rez -= coef[i][j] * valori[j];
                if(coef[i][j] != 0)
                    ok = 1;
            }
            if(ok == 0)
                {printf("Imposibil"); return;}
            ok = 0;
            valori[i] = rez / coef[i][i];
        }
        for(int i=1; i<=M; i++)
            printf("%.8f ", valori[i]);
    }
}



int main()
{
    freopen("gauss.in", "r", stdin);
    freopen("gauss.out", "w", stdout);
    scanf("%d %d", &N, &M);///N linii M+1 intregi
    for(int i=1; i<=N; i++)
        for(int j=1; j<=M+1; j++)
            scanf("%lf", &coef[i][j]);
    for(int i=1; i<=min(N, M-1); i++)
        rezolva_linia(i, i);
    raspuns_final();
    return 0;
}