Cod sursa(job #681028)

Utilizator david_raucaRauca Ioan David david_rauca Data 16 februarie 2012 13:12:03
Problema Algoritmul lui Gauss Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include<fstream>
#include<algorithm>
#include<iomanip>
using namespace std;

#define eps 0.000000001

ifstream fin("gauss.in");
ofstream fout("gauss.out");

int n, m;

double a[250][250];

void Read();
void Solve();
void Write();
double sol[251];

int main()
{
	Read();
	Solve();
	Write();
	
	fin.close();
	fout.close();
	
	return 0;
}

void Read()
{
	fin >> n >> m;
	
	for( int i = 1; i <= n; ++i )
		for( int j = 1; j <= m+1; ++j )
			fin >> a[i][j];
		
}

void Solve()
{
	int k = 1;
	
	while( k <= m )
	{
		double numar = 0;
		int l = 0;
		for( int i = k; i <= n; ++i )
			if( a[i][k] > eps || a[i][k] < -eps )
			{
				numar = a[i][k];
				l = i;
				break;
			}
			else
			{
				for( int j = 1; j <= m+1; ++j )
					swap( a[i][j], a[i+1][j] );
				i--;
			}
			
		for( int j = k; j <= m+1; ++j)
			a[l][j] /= numar;
		
		for( int i = l+1; i <= n; ++i )
		{
			numar = a[i][k];
			for( int j = k; j <= m + 1; j++ )
				a[i][j] -= (numar * a[l][j]);
		}
		k++;
	}
}

void Write()
{
	double suma = a[n][m+1] / a[n][m];
	sol[n] = suma;
	
	for( int i = n - 1; i >= 1; --i )
	{
		sol[i] = (a[i][m+1] - suma) / a[i][i];
		suma += (a[i][m+1] - suma) / a[i][i];
	}
	
	for( int i = 1; i <= n; ++i )
		fout << setprecision(8) << sol[i] << ' ';
}