Cod sursa(job #1946705)

Utilizator MaarcellKurt Godel Maarcell Data 30 martie 2017 12:48:16
Problema Algoritmul lui Gauss Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include <iostream>
#include <fstream>
#include <iomanip>
using namespace std;

#define LD long double
#define EPS 0.000000001
int N,M;
int main(){
	ifstream fin("gauss.in");
	ofstream fout("gauss.out");
	fin >> N >> M;
	
	LD a[310][310],x[310];
	memset(x,0,sizeof(x));
	
	int i,j,k;
	for (i=1; i<=N; i++)
		for (j=1; j<=M+1; j++)
			fin >> a[i][j];
	
	for (j=1; j<=M; j++){
		int ind=-1;
		for (i=j; i<=N; i++)
			if (a[i][j]<-EPS || a[i][j]>EPS){
				ind=i;
				break;
			}
		
		if (ind==-1) continue;
		for (k=1; k<=M+1; k++)
			swap(a[j][k],a[ind][k]);
			
		for (i=ind+1; i<=N; i++){
			LD coef=-a[i][j]/a[ind][j];
			for (k=j; k<=M+1; k++)
				a[i][k]+=coef*a[ind][k];
		}
	}
	
	
	
	for (i=N; i>0; i--){
		for (j=1; j<=M+1; j++)
			if (a[i][j]<-EPS || a[i][j]>EPS){
				if (j==M+1){
					fout << "Imposibil\n";
					return 0;
				}
				
				x[j]=a[i][M+1];
				for (k=j+1; k<=M; k++)
					x[j]-=x[k]*a[i][k];
				x[j]/=a[i][j];
				break;
			}
	}
	
	for (i=1; i<=M; i++)
		fout << fixed << setprecision(9) << x[i] << " ";
	fout << "\n";
	return 0;
}