Cod sursa(job #2442632)

Utilizator MortemPlaiasu Iulia-Silvia Mortem Data 24 iulie 2019 17:25:50
Problema Algoritmul lui Gauss Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.3 kb
#include <iostream>
#include <fstream>
#include <iomanip>
 
int n,m;	
long double v[350][350];
long double sol[350];
int place;
long double eps=1e-10;
 
void multR(int i, int j, int p)	
{
  if(v[i][j]!=0)	
  {
    long double mult=-v[i][j]/v[p][j];
    for(int x=j;x<=n;x++)
      v[i][x]=v[i][x]+mult*v[p][x];
  }
}	
int main()
{
  freopen("gauss.in","r",stdin);
  freopen("gauss.out","w",stdout);
  scanf("%d %d",&m,&n);
  for(int i=0;i<m;i++)
    for(int j=0;j<=n;j++)
      scanf("%llf",&v[i][j]);
  int i=0,j=0;
  while(i<m && j<n)
  {
    int k;
    for(k=i;k<m;k++)
      if(v[k][j]<-eps || v[k][j]>eps)
        break;
    if(k==m)
    {
      j++;
      continue;
    }
    if(i!=k)
      std::swap(v[i],v[k]);
    for(int l=n;l>=j;l--)
      v[i][l]=v[i][l]/v[i][j];
    for(int l=i+1;l<m;l++)
    {
      for(int o=n;o>=j;o--)
        v[l][o]-=v[l][j]*v[i][o];
    }
    i++,j++;
  }
  for( j=m-1;j>=0;j--)
  {
    int p = 0;
    while(v[j][p]<=1e-10 &&v[j][p]>=-1e-10 &&p<n)p++;
    if(p==n&& (v[j][n]>1e-10 || v[j][n]<-1e-10))
    {
      printf("Imposibil");
      return 0;
    }
    if(p==n) continue;
    long double solv = v[j][n];
    for(i=p+1;i<n;i++)
      solv-=v[j][i]*sol[i];
    sol[p]=solv/v[j][p];
  }
  std::cout<<std::setprecision(10)<<std::fixed;
  for(j=0;j<n;j++)
      std::cout<<sol[j]<<" ";
}