Cod sursa(job #1606747)

Utilizator nnnmmmcioltan alex nnnmmm Data 20 februarie 2016 14:55:52
Problema Algoritmul lui Gauss Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<iomanip>
const double eps=1e-10;
const int NMAX=301;
double v[NMAX][NMAX];
double rasp[NMAX];
int n,m;
void schimba(int l1,int l2)
{
 for(int j=1;j<=m+1;j++)
     std::swap(v[l1][j],v[l2][j]);
}
void inmultire(int l,double alfa)
{
 for(int j=1;j<=m+1;j++)
     v[l][j]*=alfa;
}
void scadere(int l1,int l2,double alfa)
{
 for(int j=1;j<=m+1;j++)
     v[l1][j]-=v[l2][j]*alfa;
}
int main()
{
 freopen("gauss.in","r",stdin);
 freopen("gauss.out","w",stdout);
 scanf("%d %d ",&n,&m);
 for(int i=1;i<=n;i++)
     for(int j=1;j<=m+1;j++)
         std::cin>>v[i][j];
 int cate=0;
 ///Eliminare
 for(int col=1;col<=m;col++)
     {
      int lin=cate+1;
      while(fabs(v[lin][col])<eps && lin<=n)
            lin++;
      if(lin==n+1)
         continue;
      schimba(cate+1,lin);
      cate++;
      inmultire(cate,1/v[lin][col]);
      for(int lin=cate+1;lin<=n;lin++)
          scadere(lin,cate,v[lin][col]);
     }
 ///Imposibil
 for(int lin=cate+1;lin<=n;lin++)
   {
    if(fabs(v[lin][m+1]>=eps))
       {
        printf("Imposibil\n");
        return 0;
       }
   }
 ///"Subtitutie inversa"
 for(int lin=cate;lin>=1;lin--)
     {
      int pivot=1;
      while(pivot<=m && fabs(v[lin][pivot])<eps)
            pivot++;
      rasp[pivot]=v[lin][m+1];
      for(int col=pivot+1;col<=m;col++)
          rasp[pivot]-=v[lin][col]*rasp[col];
     }
 ///Afisare
 for(int col=1;col<=m;col++)
     {
      std::cout<<std::fixed<<std::setprecision(10)<<rasp[col]<<((col==m)?"\n":" ");
     }
 return 0;
}