Cod sursa(job #2893741)

Utilizator mircea_007Mircea Rebengiuc mircea_007 Data 26 aprilie 2022 16:59:38
Problema Algoritmul lui Gauss Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.24 kb
// This program was written on 25.04.2022
// for problem gauss
// by Mircea Rebengiuc

#include <stdio.h>
#include <ctype.h>

#include <valarray>

#define EPS 1e-7
#define NIL -1

#define MAXN 300
#define MAXM 300

std::valarray<double> e[MAXN];
int vdom[MAXN];
double rez[MAXM];
bool hazval[MAXM];

static inline bool null( const double &t ){
  return std::abs( t ) <= EPS;
}

FILE *fin, *fout;

static inline void tableflip(){
  fprintf( fout, "Imposibil!\n" );
  fclose( fin );
  fclose( fout );
  exit( 0 );
}


int main(){
  fin  = fopen( "gauss.in",  "r" );
  fout = fopen( "gauss.out", "w" );
  
  int n, m, i, j, k, impos = 0;
  
  fscanf( fin, "%d%d", &n, &m );
  for( i = 0 ; i < n ; i++ ){
    e[i].resize( m + 1 );
    
    for( j = 0 ; j <= m ; j++ )
      fscanf( fin, "%lf", &e[i][j] );
    
    vdom[i] = NIL;
  }
  
  for( i = j = 0 ; i < n && j < m ; j++ ){
    if( null( e[i][j] ) ){// nu avem variabila 'dominanta'
      // gasim alta ecuatie cu coeficient nenul
      k = i + 1;
      while( k < n && null( e[k][j] ) )
        k++;
      
      if( k < n ){
        std::swap( e[i], e[k] );// O(1)
      }else{
        impos = 1;
      }
    }
    
    if( !null( e[i][j] ) ){
      vdom[i] = j;

      // facem toti coeficientii de la variabila j nuli
      for( k = 0 ; k < n ; k++ )
        if( k != i && !null( e[k][j] ) )
          e[k] -= e[i] * (e[k][j] / e[i][j]);
      
      i++;
    }
  }
  
  // verificam daca sunt coeficienti nenuli inainte de variabila dominanta
  for( i = 0 ; i < n ; i++ )
    for( j = 0 ; j < vdom[i] ; j++ )
      if( !null( e[i][j] ) )
        tableflip();
  
  /*
  for( i = 0 ; i < n ; i++ ){
    printf( "(%2d) |", vdom[i] );
    for( j = 0 ; j < m ; j++ )
      printf( " %lf", e[i][j] );
    printf( " | %lf\n", e[i][m] );
  }
  */

  for( j = 0 ; j < m ; j++ )
    hazval[j] = false;
  
  // scoatem variabilele din matrice
  for( i = 0 ; i < n ; i++ ){
    j = 0;
    while( j < m && null( e[i][j] ) )
      j++;
    
    if( j < m ){
      rez[j] = e[i][m] / e[i][j];
      hazval[j] = true;
    }
  }
  
  for( j = 0 ; j < m ; j++ ){
    if( !hazval[j] ){
      rez[j] = 0;
    }
  }
  
  for( j = 0 ; j < m ; j++ )
    fprintf( fout, "%.10lf ", rez[j] );
  fputc( '\n', fout );
  
  fclose( fin );
  fclose( fout );
  return 0;
}