Cod sursa(job #2303016)

Utilizator danielsociuSociu Daniel danielsociu Data 15 decembrie 2018 13:38:54
Problema Algoritmul lui Gauss Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.18 kb
#include <fstream>
#include <vector>
#include <iomanip>
std::ifstream cin("gauss.in");
std::ofstream cout("gauss.out");
#define dif 0.0000001
#define maxn 305

int N,M;
double v[maxn][maxn],sol[maxn];

int i=1,j=1;

inline void equalize(){
	for(int j=::j+1;j<=M+1;j++){
		v[::i][j]/=v[::i][::j];
	}
	v[::i][::j]=1;
}
inline void makeUnique(){
	for(int i=::i+1;i<=N;i++){
		for(int j=::j+1;j<=M+1;j++)
			v[i][j]-=v[::i][j]*v[i][::j];
		v[i][::j]=0;
	}
}
int main()
{
	cin>>N>>M;
	for(int a=1;a<=N;a++)
		for(int b=1;b<=M+1;b++)
			cin>>v[a][b];
	while(i<=N&&j<=M){
		int k;
		for(k=i;k<=N;k++)
			if(v[k][j]<-dif||v[k][j]>dif)
				break;
		if(k==N+1){ //variabila livera
			++j;
			continue;
		}
		if(k!=i){
			int aux;
			for(int x=1;x<=M+1;x++)
				aux=v[i][x],v[i][x]=v[k][x],v[k][x]=aux;
		}
		equalize();
		makeUnique();
		i++;j++;
	}
	//creare solutie daca posibil
	for(int k=N;k>0;--k){
		for(int j=1;j<=M+1;j++){
			if(v[k][j]<-dif||v[k][j]>dif){
				if(j==M+1){
					cout<<"Imposibil";
					return 0;
				}
				sol[j]=v[k][M+1];
				for(int x=j+1;x<M+1;x++)
					sol[j]-= sol[x]*v[k][x];
				break;
			}
		}
	}
	//Afisare
	for(int i=1;i<=N;i++)
		cout<<std::fixed<<std::setprecision(10)<<sol[i]<<' ';

}