Cod sursa(job #1584101)

Utilizator RadduFMI Dinu Radu Raddu Data 29 ianuarie 2016 18:27:21
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#include <iostream>
#include <fstream>
#include <iomanip>
#include <cmath>
using namespace std;
ifstream f("gauss.in");
ofstream g("gauss.out");
 int n,m,lin,col,sol=1,calc[305];
 double a[305][305],val,ans[305],sum;
int main()
{ int i,j,ok,pos;
    f>>n>>m;

  for(i=1;i<=n;i++)
   for(j=1;j<=m+1;j++)
    f>>a[i][j];

  lin=1; col=1;

 /*for(i=1;i<=n;i++)
   {for(j=1;j<=m+1;j++)
     cout<<a[i][j]<<" ";
     cout<<"\n";
   }
   cout<<"\n\n";
*/
  while(lin<=n && col<=m)
  {
    ok=0;
    for(i=lin;i<=n;i++)
     if (a[i][col]!=0) {ok=i; break;}

    if (ok)
    {
       if (ok!=lin)
        for(j=1;j<=m+1;j++)
         swap(a[lin][j],a[ok][j]);

       val=a[lin][col];
       for(j=1;j<=m+1;j++)
        a[lin][j]/=val;

       for(i=lin+1;i<=n;i++)
       { val=a[i][col];
        for(j=col;j<=m+1;j++)
         a[i][j]-=a[lin][j]*val;
       }
    }

     lin++; col++;

 /*for(i=1;i<=n;i++)
   {for(j=1;j<=m+1;j++)
     cout<<a[i][j]<<" ";
     cout<<"\n";
   }
   cout<<"\n\n";
*/
  }


  for(i=n;i>=1;i--)
   {
     pos=0;
   for(j=1;j<=m;j++)
    if (a[i][j]!=0) {pos=j; break;}

   if (pos)
   { sum=a[i][m+1];

    for(j=pos+1;j<=m;j++)
    if (a[i][j]!=0)
    { if (calc[j]) sum-=(double)a[i][j]*ans[j];
    }

   calc[pos]=1; ans[pos]=sum/a[i][pos];


   }

   }

  if (sol)
   for(i=1;i<=n;i++)
   {for(j=1;j<=m;j++)
     a[i][m+1]-=(double) a[i][j]*ans[j];

    if (a[i][m+1]>1e-9 || a[i][m+1]<-1e-9) {sol=0; break;}
   }


  if (sol)
   for(i=1;i<=m;i++)
    g<<fixed<<setprecision(10)<<ans[i]<<" ";
   else g<<"Imposibil\n";

    return 0;
}