Cod sursa(job #2553760)

Utilizator altcontnoualt cont altcontnou Data 22 februarie 2020 11:45:11
Problema Algoritmul lui Gauss Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.91 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("gauss.in");
ofstream g("gauss.out");

class matrice
{
public:
    void citire()
    {
        f >> nr_ec >> nr_nec;
        int aux=nr_nec+1;
        for (int i=1; i<=nr_ec; ++i)
        {
            for (int j=1; j<=aux; ++j)
                f >> mat[i][j], initial[i][j]=mat[i][j];
        }
    }

    void impartire_linie(int linie, double val)
    {
        int aux=nr_nec+1;
        for (int j=linie; j<=aux; ++j)
            mat[linie][j]/=val;
    }

    void stergere_din_linie(int din, int pe, double inmultire)
    {
        int aux=nr_nec+1;
        for (int j=1; j<=aux; ++j)
        {
            mat[din][j]-=mat[pe][j]*inmultire;
        }
    }

    bool cautare_jos(int l, int c)
    {
        for (int i=l+1; i<=nr_ec; ++i)
        {
            if (mat[i][c]!=0)
            {
                swap(mat[l],mat[i]);
                return 1;
            }
        }
        return 0;
    }

    void solve()
    {
        for (int i=1; i<=nr_ec; ++i)
        {
            if (mat[i][i]==0)
            {
                if (cautare_jos(i,i)==0)
                {
                    i++;
                    continue;
                }
            }
            if (i<=nr_nec)
            {
                impartire_linie(i,mat[i][i]);
                for (int j=i+1; j<=nr_ec; ++j)
                {
                    stergere_din_linie(j,i,mat[j][i]/mat[i][i]);
                }
            }


        }
    }

    bool verificare_linie(int ind)
    {
        int aux=nr_nec+1;
        for (int i=1; i<=aux; ++i)
            if (mat[i][aux])
                return true;
        return false;
    }

    bool verificare_total()
    {
        for (int i=1; i<=nr_ec; ++i)
        {
            double s=0;
            for (int j=1; j<=nr_nec; ++j)
            {
                s+=initial[i][j]*rez[j];
            }
            if (s!=initial[i][nr_nec+1])
                return 0;
        }
        return 1;
    }

    void afisare()
    {
        int aux=nr_nec+1;
        for (int i=nr_ec; i>0; --i)
        {
            if (verificare_linie(i))
            {
                rez[i]=mat[i][aux]/mat[i][i];
                for (int j=i-1; j>0; --j)
                    mat[j][aux]-=mat[j][i]*rez[i];
            }
            else
            {
                g << "Imposibil";
                return;
            }
        }
        if(!verificare_total())
        {
            g << "Imposibil\n";
            return;
        }
        for (int i=1; i<=nr_nec; ++i)
            g << setprecision(10)<<fixed<<rez[i] <<' ';
    }

public:
    int nr_ec, nr_nec;
    double mat[305][305], rez[305], initial[305][305];

} ecuatie;

int nr_ec, nr_nec;

int main()
{
    ecuatie.citire();
    ecuatie.solve();
    ecuatie.afisare();
    return 0;
}