Cod sursa(job #2394800)

Utilizator razvanradulescuRadulescu Razvan razvanradulescu Data 1 aprilie 2019 22:28:33
Problema Algoritmul lui Gauss Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.31 kb
#include <iostream>
#include <cstdio>
#include <math.h>
using namespace std;

int n, m;
double a[400][400], numere[400];

void verifToSwap(int &i, int &j)
{
    bool ok = 1;
    if(fabs(a[i][j]) < 0.00001)
    {
        for(int i2 = i+1; i2<m && ok; i2++)
        {
            if(a[i2][j] != 0)
            {
                ok = 0;
                swap(a[i], a[i2]);
            }
        }
    }
    else
        ok = 0;
    if(ok)
    {
        i+=1;
        j+=1;
        verifToSwap(i, j);
    }
}

void multLine(double mult, int line)
{
    for(int j = line; j<=m; j++)
    {
        a[line][j] *= mult;
    }
}

void add2Lines(int line1, int line2)
{
    for(int j = line1; j<=m; j++)
    {
        a[line2][j] += a[line1][j];
    }
}

void rez()
{
    scanf("%d %d", &n, &m);
    if(n<m)
    {
        printf("IMPOSIBIL");
        return;
    }
    for(int i = 0; i<n; i++)
    {
        for(int j = 0; j<=m; j++)
        {
            scanf("%lf", &a[i][j]);
        }
    }
    int x = 0;
    int y = 0;
    double aux;
    verifToSwap(x, y);
    while(x < m-1 & y < m-1)
    {
        multLine(1/a[x][y], x);
        for(int i = x+1; i<m; i++)
        {
            if(a[i][y] == 0)
                continue;
            aux = -a[i][y];
            multLine(aux, x);
            add2Lines(x, i);
            multLine(1/aux, x);
        }
        x++;
        y++;
        verifToSwap(x, y);
    }
    double suma;
    for(int i = m-1; i>=0; i--)
    {
        suma = a[i][m];
        for(int j = i+1; j<m; j++)
        {
            suma-=(a[i][j]*numere[j]);
        }
        numere[i] = suma / a[i][i];
    }
    if(n>m)
    {
        double total;
        for(int i = m; i<n; i++)
        {
            total = 0;
            for(int j = 0; j<m; j++)
            {
                total += a[i][j]*numere[j];
            }
            if(fabs(a[i][m] - total) < 0.00001)
            {

            }
            else
            {
                printf("IMPOSIBIL");
                return;
            }
        }
    }
    for(int i = 0; i<m; i++)
    {
        printf("%.10f ", numere[i]);
    }
}

int main()
{
    freopen("gauss.in", "r", stdin);
    freopen("gauss.out", "w", stdout);
    rez();
    return 0;
}