Cod sursa(job #1599182)

Utilizator ZanoxNonea Victor Zanox Data 13 februarie 2016 17:55:08
Problema Algoritmul lui Gauss Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.03 kb
#include <iostream>
#include <iomanip>
#include <fstream>

using namespace std;

int n,m,i,j,k,l;

struct ec
{
    double c[302];
    ec *prec,*urm;
}*p,*u,*t,*v;

void aprox(double&a)
{
    double aint=double(int(a*1e8))/1e8;
    if(a<aint+5e-9)a=aint;
    else a=aint+1e-8;
}

int pr(ec*a)
{
    int i=1;
    while(a->c[i]==0&&i<=n+1)i++;
    if(i==n+2)return 0;
    return i;
}

void simpl(ec*a,ec*b,int i)
{
    int j;
    double k=a->c[i]/b->c[i];
    for(j=1;j<=n+1;j++)
    {
        a->c[j]-=b->c[j]*k;
        if(j==i)aprox(a->c[j]);
    }
}

    fstream f;
    double sol[301];

int main()
{
    f.open("gauss.in",ios_base::in);
    f>>m>>n;

    p=new ec;
    u=new ec;

    t=new ec;
    p->urm=t;
    t->prec=p;
    u->prec=t;
    t->urm=u;
    for(j=1;j<=n+1;j++)f>>t->c[j];
    t->c[n+1]=-t->c[n+1];

    for(i=2;i<=m;i++)
    {
        t=new ec;
        u->prec->urm=t;
        t->prec=u->prec;
        u->prec=t;
        t->urm=u;

        for(j=1;j<=n+1;j++)f>>t->c[j];
        t->c[n+1]=-t->c[n+1];
    }

    f.close();
    f.open("gauss.out",ios_base::out);
    for(i=1;i<=n;i++)
    {
        for(t=p->urm,v=NULL;t!=u;t=t->urm)if(pr(t)==i)v=t;
        if(v!=NULL)for(t=p->urm;t!=u;t=t->urm)if(t!=v)
        {
            /*
            for(j=1;j<=n+1;j++)cout<<v->c[j]<<' ';
            cout<<'\n';
            for(j=1;j<=n+1;j++)cout<<t->c[j]<<' ';
            cout<<'\n';
            cout<<'\n';
            */
            simpl(t,v,i);
            /*
            for(j=1;j<=n+1;j++)cout<<t->c[j]<<' ';
            cout<<'\n';
            cout<<'\n';
            cout<<'\n';
            */
            if(pr(t)==n+1)
            {
                f<<"Imposibil";
                return 0;
            }
        }
    }

    for(t=p->urm;t!=u;t=t->urm)
    {
        i=pr(t);
        sol[i]=-t->c[n+1]/t->c[i];
    }
    for(i=1;i<=n;i++)f<<fixed<<setprecision(8)<<sol[i]<<' ';
    return 0;
}

//functie de 2 ecuatii, pt f(a,b,n) a-=b/b(n)*a(n)