Cod sursa(job #2953638)

Utilizator marcumihaiMarcu Mihai marcumihai Data 11 decembrie 2022 21:15:19
Problema Algoritmul lui Gauss Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.82 kb
#include <bits/stdc++.h>

using namespace std;

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

int n,m;
double mt[305][305];
double rez[305];
double val[305];
int npc[305];
double copie[305][305];
double crez[305];

void schimbare(int A, int B)
{
    for(int i=1; i<=m; ++i)
        swap(mt[A][i], mt[B][i]);
    swap(rez[A], rez[B]);
}

void scadere(int A, int B)
{
    double inm=mt[B][A];
    for(int i=1; i<=m; ++i)
        mt[B][i]-=mt[A][i]*inm;
    rez[B]-=rez[A]*inm;


}


int main()
{
    f>>n>>m;
    for(int i=1; i<=n; ++i)
    {
        for(int j=1; j<=m; ++j)
            f>>mt[i][j] , copie[i][j]=mt[i][j];
        f>>rez[i];
        crez[i]=rez[i];
    }
    for(int i=1; i<=m; ++i)
    {
        int ok=1;
        for(int j=i; j<=n; ++j)
        {
            if(mt[j][i]!=0)
            {
                schimbare(i,j);
                ok=0;
                break;
            }
        }
        npc[i]=ok;
        double x=mt[i][i];
        rez[i]=rez[i]/x;
        for(int j=1; j<=m; ++j)
            mt[i][j]=(double)mt[i][j]/x;

        for(int j=i+1; j<=n; ++j)
            scadere(i,j);
    }
    for(int i=n; i>0; --i)
    {
        double pus=0;
        int elem=0;
        for(int j=1; j<=m; ++j)
        {
            if(mt[i][j]!=0 && val[j]==0 && npc[j]==0)
                elem=j;
            else
                pus+=val[j]*mt[i][j];
        }
        if(elem!=0)
            val[elem]=(rez[i]-pus)/mt[i][elem];
    }
    for(int i=1;i<=n;++i)
    {
        double kk=0;
        for(int j=1;j<=m;++j)
            kk+=val[j]*mt[i][j];
        if(kk!=crez[i])
        {
            g<<"Imposibil";
            return 0;
        }
    }
    for(int i=1;i<=m;++i)
        g<<fixed<<setprecision(10)<<val[i]<<" ";



    return 0;
}