Cod sursa(job #936782)

Utilizator Cosmin1490Balan Radu Cosmin Cosmin1490 Data 8 aprilie 2013 18:49:58
Problema Algoritmul lui Gauss Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.07 kb
#include <stdlib.h>
#include <fstream>
#include <iostream>
#include <string>
#include <queue>
#include <stack>
#include <vector>
#include <string.h>
#include <iomanip>
#include <time.h>
#include <list>
using namespace std;


const string file = "gauss";

const string infile = file + ".in";
const string outfile = file + ".out";


#define MAXN 305

int N;
int M;

double A[MAXN][MAXN];
double X[MAXN];

const double eps = 0.0000001;

void citire()
{
	ifstream fin(infile.c_str());

	fin >> N >> M;

	for(int i = 0; i < N; i++)
	{
		for(int j = 0; j < M + 1; j++)
		{
			int x;
			fin >> x;

			A[i][j] = x;
		}
	}

	fin.close();
}

void afisare()
{
	ofstream fout(outfile.c_str());
	fout << fixed << setprecision(8);
	for(int i = 0; i < M; i++)
	{
		fout << X[i] << " ";
	}
	fout << "\n";
	fout.close();
}


void debugPrint()
{
	for(int i = 0; i < N; i++)
	{
		for(int j = 0; j < M; j++)
		{
			cout << A[i][j] << "\t";
		}
		cout << "\n";
	}
	cout << "\n";
}

void solve()
{
	int i = 0;
	int j = 0;
	int k;
	while(i < N || j < M)
	{
		for(k = i; k < N; k++)
		{
			if( A[k][j] != 0)
				break;
		}
		
		if(k == N)
		{
			j++;
			continue;
		}

		if(k != i)
		{
			for(int x = j; x < M + 1; x++)
			{
				swap(A[i][x], A[k][x]);
			}

		}

		double val = A[i][j];
		for(int x = j; x < M + 1; x++)
		{
			A[i][x] /= val;
		}

		for(int linie = i+1; linie < N; linie++)
		{
			for(int coloana = j+1; coloana < M + 1; coloana++)
			{
				A[linie][coloana] -= A[linie][j] * A[i][coloana];
			}
			A[linie][j] = 0;
		}


		i++;
		j++;
		//debugPrint();
	}

	for(int i = N - 1; i >= 0; i--)
	{
		for(int j =  0; j <= M + 1; j++)
		{
			if(abs(A[i][j]) < eps)
			{
				continue;
			}

			if(j == M + 1)
			{
				ofstream fout(outfile.c_str());
				fout << "Imposibil\n";
				fout.close();
				return;
			}

			X[j] = A[i][M];
			for(int k = j + 1; k < M; k++)
			{
				X[j] -= X[k] * A[i][k];
			}

		}
	}
	afisare();
}



int main()
{
	citire();
	solve();
	
}