Cod sursa(job #1891532)

Utilizator ionut98Bejenariu Ionut Daniel ionut98 Data 24 februarie 2017 09:30:37
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include<fstream>
#include<iomanip>
#define eps 1e-8
using namespace std;
ifstream f("gauss.in");
ofstream g("gauss.out");
int m,n,i,j,p[310],c,l;//in p[i]retin indicele radacinei care imi permite sa o calculez cu ajutorul termenului liber de pe linia i
double a[310][310],ans[310],aux;
double modul(double x)//intoarce |x|
{
    return max(x,-x);
}
int main()
{
    f>>n>>m;
    for(i=1;i<=n;++i)//citesc matricea initiala
      for(j=1;j<=m+1;++j)
        f>>a[i][j];
    for(i=1;i<=n;++i)//iau fiecare ecuatie pe rand
    {
        for(j=1;j<=m+1;++j)//iau fiecare element de pe linie
          if(modul(a[i][j])>=eps)//caut prima valoare nenula
            break;
        if(j==m+2)
          continue;
        if(j==m+1)//nu exisat o solutie
        {
            g<<"Imposibil\n";
            return 0;
        }
        p[i]=j;//in p[i] retin coloana la care ajung
        for(l=1;l<=n;++l)//iau din nou fiecare linie pe rand
          if(l!=i&&modul(a[l][p[i]])>=eps)//am grija sa nu iau linia curenta si sa iau doar valoari nenule de pe linie
          {
              aux=a[l][p[i]]/a[i][p[i]];//iau catul impartirii elementului la care mja afluu cu elemantul de referinta calculat mai sus
              for(c=1;c<=m+1;++c)//reduc elementele intregii linii
                a[l][c]-=aux*a[i][c];
          }
    }
    for(i=1;i<=n;++i)//calculez valorile radacinilor matricea fii simplificata cat de mult a fost posibil
      if(p[i])
        ans[p[i]]=a[i][m+1]/a[i][p[i]];
    for(i=1;i<=m;++i)
      g<<fixed<<setprecision(10)<<ans[i]<<" ";
    return 0;
}