Cod sursa(job #1247971)

Utilizator deea101Andreea deea101 Data 24 octombrie 2014 13:31:38
Problema Algoritmul lui Gauss Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#include <fstream>
#include <iomanip>
#include <cmath>

#define NMAX 300
#define MMAX 300
#define epsi 0.0000000001
using namespace std;
ifstream f("gauss.in");
ofstream g("gauss.out");

double A[NMAX+1][MMAX+1],sol[MMAX];
int n,m,bad=0;

void read()
{
	f>>n>>m;

	int i,j;
	for(i=1;i<=n;i++)
		for(j=1;j<=m+1;j++)
			f>>A[i][j];
}

void show()
{
	int i,j;
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=m+1;j++)
			g<<setw(9)<<A[i][j]<<' ';
		g<<'\n';
	}
}

bool egal ( double a , double b )
{
	if ( abs(a-b) < epsi )
		return 1;
	else return 0;
}

void interChange ( int i, int k )
{
	int j;
	double aux;

	for(j=1;j<=m+1;j++)
	{
		aux = A[i][j];
		A[i][j] = A[k][j];
		A[k][j] = aux;
	}

}

void kill ( int a, int b )
{
	int i,j;
	double d;

	for( i=a+1; i<=n; i++)
	{
		d=A[i][b]/A[a][b];
		for( j=b; j<=m+1; j++)
		{
			A[i][j]-=A[a][j]*d;
		}
	}
}

void solve ()
{
	int i=1,j=1,k;
	double d;

	while( i<=n && j<=m )
	{
		for( k=i ; k<=n ; k++ )
			if( ! egal(A[k][j],0) ) break;

		if(k == n+1) { j++;}
		else
		{
			if(k!=i) interChange(i,k);

			d=A[i][j];
			for(k=j;k<=m+1;k++)
				A[i][k]/=d;

			kill(i,j);
			i++; j++;
		}

	}
}

void getSol()
{
	int i,j;

	for( i=n; i>=1; i--)
	{
		sol[i]=A[i][m+1];
		for( j=i+1; j<=m; j++)
		{
			sol[i]-=sol[j]*A[i][j];
		}

		if( egal( A[i][i], 0) && ( !egal(sol[i],0)) )
		{
			g<<"Imposibil"; bad=1;
			break;
		}
	}
}

int main()
{
	int i, j;

	read();

	solve(); // reduces to echeleon form
	//show();
	//g<<'\n';

	getSol();
	if(!bad)
	{
		for(i=1;i<=m;i++)
			g<<sol[i]<<' ';
	}
}