Cod sursa(job #2592133)

Utilizator Rares31100Popa Rares Rares31100 Data 1 aprilie 2020 11:07:25
Problema Algoritmul lui Gauss Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.71 kb
#include <bits/stdc++.h>

using namespace std;

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

int n,m,nr;
double ec[301][301],sol[301];
double rez[301];

void schimba(int i,int j)
{
    for(int k=1;k<=m;k++)
        swap(ec[i][k],ec[j][k]);

    swap(sol[i],sol[j]);
}

void scade(int i,int j,double coef)
{
    for(int k=1;k<=m;k++)
        ec[i][k]-=ec[j][k]*coef;

    sol[i]-=sol[j]*coef;
}

int main()
{
    in>>n>>m;
    nr=m;

    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
            in>>ec[i][j];
        in>>sol[i];
    }

    if(m>n)
        m=n;

    int poz=m;
    for(int i=1;i<=m;i++)
    {
        for(int j=i;j<=n;j++)
            if( fabs(ec[j][poz])>0.0001 )
            {
                schimba(i,j);
                break;
            }

        if( fabs(ec[i][poz])>0.0001 )
            for(int j=i+1;j<=n;j++)
                scade(j,i,ec[j][poz]/ec[i][poz]);

        poz--;
    }

    for(int i=1;i<=n;i++)
    {
        bool ok=0;
        for(int j=1;j<=n && !ok;j++)
            if( fabs(ec[i][j])>0.0001 )
                ok=1;

        if(!ok && fabs(sol[i])>0.0001 )
        {
            out<<"Imposibil";
            return 0;
        }
    }

    for(int i=m;i>=1;i--)
    {
        double sum=0;

        if( fabs(ec[i][m-i+1])>0.0001 )
        {
            for(int j=1;j<=m-i;j++)
                sum+=ec[i][j]*rez[j];

            rez[m-i+1]=(sol[i]-sum)/ec[i][m-i+1];
        }
        else if( fabs(sol[i]-sum)>0.0001 )
        {
            out<<"Imposibil";
            return 0;
        }
    }

    for(int i=1;i<=nr;i++)
        out<<setprecision(8)<<fixed<<rez[i]<<' ';

    return 0;
}