Cod sursa(job #1778616)

Utilizator andrew_assassin789Andrei Manea andrew_assassin789 Data 13 octombrie 2016 22:19:28
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.05 kb
#include <fstream>
#define nmax 310
#include <iomanip>
using namespace std;
double x[nmax];
double eps=0.0000000001;
double a[nmax][nmax];
bool ap(double x)
{
    return (-eps<=x && x<=eps);
}
int main()
{
    ifstream f("gauss.in");
    ofstream g("gauss.out");
    int n,m,i,j,ii,jj;bool ok=true;
    f>>n>>m;
    for (i=1;i<=n;i++)
        for (j=1;j<=m+1;j++)
            f>>a[i][j];
    i=j=1;
    while ( i<=n && j<=m )
    {
        for (ii=i;ap(a[ii][j]) && ii<=n;ii++);
        //aflam primul element nenul de pe coloana j
        if (ii==n+1) j++;
        //daca nu exista incrementam j-ul
        else
        {
            if (i!=ii)
            {
                //interschimbam lina ii cu linia i
                for (jj=1;jj<=m+1;jj++)
                    swap(a[i][jj],a[ii][jj]);
            }
            //impartim cu a[i][j] linia i
            for (jj=j+1;jj<=m+1;jj++)
                a[i][jj]/=a[i][j];
            a[i][j]=1;
            //creem termeni liberi pe toata coloana j
            for (ii=i+1;ii<=n;ii++)
                if (!ap(a[ii][j]))
                {
                    for (jj=j+1;jj<=m+1;jj++)
                    {
                        a[ii][jj]-=(a[ii][j]*a[i][jj]);
                    }
                    a[ii][j]=0;
                }
            i++;j++;
        }
    }
    for (i=n;i>=1;i--)
        for (j=1;j<=m+1;j++)
            if (!ap(a[i][j]))
            {
                if (j==m+1)
                {
                    i=0;
                    ok=false;
                }
                else
                {
                    x[j]=a[i][m+1];
                    for (jj=m;jj>=j+1;jj--)
                    {
                        x[j]-=(x[jj]*a[i][jj]);
                    }
                    j=m+2;
                }
            }
    if (ok)
    {
        g<<setprecision(10)<<fixed;
        for (i=1;i<=m;i++)
            g<<x[i]<<' ';
        g<<'\n';
    }
    else g<<"Imposibil\n";
    f.close();
    g.close();
    return 0;
}