Cod sursa(job #1244571)

Utilizator SebiSebiPirtoaca George Sebastian SebiSebi Data 17 octombrie 2014 20:11:55
Problema Algoritmul lui Gauss Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include<iostream>
#include<fstream>
#include<math.h>
#include<iomanip>
using namespace std;

#define NMAX 302
#define eps 0.0000000001

double a[NMAX][NMAX],x[NMAX];

int egal(double x, double y)
{
	if(fabs(x-y)<=eps)
		return 1;
	return 0;
}

void afiseaza(int n, int m)
{
	int i,j;
	for(i=1;i<=n;i++) {
		for(j=1;j<=m+1;j++) 
			if(egal(a[i][j],0))
				cout<<"0 ";
			else cout<<a[i][j]<<" ";
		cout<<'\n';
	}
	cout<<'\n';
}

int main ()
{
	int i,j,k,poz,n,m,lin;
	double aux,mul;
	ifstream f("gauss.in");
	ofstream g("gauss.out");
	f>>n>>m;
	for(i=1;i<=n;i++)
		for(j=1;j<=m+1;j++)
			f>>a[i][j];
	f.close();
	lin=1;
	for(j=1;j<=m && lin<=n-1;j++) {
		if(egal(a[lin][j],0)) {
			poz=-1;
			for(i=lin;i<=n;i++)
				if(egal(a[i][j],0)==0) {
					poz=i;
					break;
				}
			if(poz==-1)
				continue;
			for(k=j;k<=m+1;k++) {
				aux=a[poz][k];
				a[poz][k]=a[lin][k];
				a[lin][k]=aux;
			}
		}
		for(i=lin+1;i<=n;i++) {
			mul=a[i][j]/a[lin][j];
			for(k=j;k<=m+1;k++)
				a[i][k]=a[i][k]-mul*a[lin][k];
		}
		lin++;
	}
	//afiseaza(n,m);
	for(i=lin;i<=n;i++) {
		for(j=1;j<=m;j++)
			if(egal(a[i][j],0)==0)
				break;
		if(j>m) {
			if(egal(a[i][m+1],0)==0)
				break;
		}
	}
	if(i<=n) {
		g<<"Imposibil";
		g.close();
		return 0;
	}
	for(i=n;i>=1;i--) {
		for(j=m;j>=1;j--)
			if(egal(a[i][j],0))
				break;
		if(j==m)
			continue;
		for(k=j+1;k<=m;k++)
			a[i][m+1]=a[i][m+1]-a[i][k]*x[k];
		x[j+1]=a[i][m+1]/a[i][j+1];
	}
	g<<fixed;
	for(i=1;i<=m;i++)
		g<<setprecision(8)<<x[i]<<" ";
	g.close();
	return 0;
}