Cod sursa(job #613306)

Utilizator Catah15Catalin Haidau Catah15 Data 21 septembrie 2011 09:23:30
Problema Algoritmul lui Gauss Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include <iostream>

using namespace std;

#define maxN 305
#define dif 0.00001


int N, M;
double A[maxN][maxN], X[maxN];


void swap (int i , int j)
{
	for (int t = 1; t <= M + 1; ++ t)
	{
		double aux = A[i][t];
		A[i][t] = A[j][t];
		A[j][t] = aux;
	}
}


void gauss ()
{
	for (int i = 1, j = 1; i <= N && j <= M; )
	{
		int l = i;
		
		for (l = i; l <= N; ++ l)
			if (A[l][i] > dif || A[l][i] < - dif) break;
		
		if (l == N + 1)
		{
			++ j;
			continue;
		}
		
		if (l != i) swap (l, i);
		
		for (int t = j + 1; t <= M + 1; ++ t) A[i][t] /=  A[i][j];
		A[i][j] = 1;
		
		for (int t = i + 1; t <= N; ++ t)
		{
			for (int u = j + 1; u <= M + 1; ++ u)
				A[t][u] -= A[t][j] * A[i][u];
			
			A[t][j] = 0;
		}
		
		++ i, ++ j;
	}
	
	
	for (int i = N; i > 0; -- i)
		for (int j = 1; j <= M + 1; ++ j)
			if (A[i][j] > dif || A[i][j] < - dif)
			{
				if (j == M + 1)
				{
					printf ("Imposibil\n");
					return;
				}
				
				X[j] = A[i][M + 1];
				
				for (int t = j + 1; t <= M; ++ t)
					X[j] -= X[t] * A[i][t];
				
				break;
			}
	

	for (int i = 1; i <= M; ++ i) printf ("%.8lf ", X[i]);
}


int main()
{
	freopen ("gauss.in", "r", stdin);
	freopen ("gauss.out", "w", stdout);
	
	scanf ("%d %d", &N, &M);
	
	for (int i = 1; i <= N; ++ i)
		for (int j = 1; j <= M + 1; ++ j) scanf ("%lf", &A[i][j]);
	
	gauss ();
	
	return 0;
}