Pagini recente » Cod sursa (job #1646383) | Cod sursa (job #3181209) | Cod sursa (job #2892123) | Cod sursa (job #2946884) | Cod sursa (job #2893741)
// 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;
}