Cod sursa(job #2704328)

Utilizator mitocaru_marioMitocaru Mario-Alexandru mitocaru_mario Data 10 februarie 2021 12:31:26
Problema Algoritmul lui Gauss Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.19 kb
#include<cstdio>
#include<algorithm>
#define dim 309
#define err 0.00000001
double sol[dim],A[dim][dim];
int n,m;
using namespace std;
void gauss(){
	int i , j;
	i = j = 1 ;
	while( i <= n && j <= m){
		int k;
		for(k=i;k<=n;k++)
			if(A[k][j]<-err || A[k][j]>err)
				break;
		if(k==n+1){
			++j;
			continue;
		}
		if(k!=i){

			for(int  y = 1; y <= m+1; ++y ){
				swap(A[i][y],A[k][y]);
			}

		}

		for(int y=j+1 ; y <= m+1 ;++y )
			A[i][y]=A[i][y]/A[i][j];

		A[i][j]=1;

		for(int x = i+1 ; x<= n; ++x){

			for(int y=j+1 ;y<=m+1 ;++y){

				A[x][y]-=A[x][j]*A[i][y];

			}
			A[x][j]=0;
		}
		++i;
		++j;
	}
}
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();

	for(int i=n;i>=1;--i){

		for(int j=1;j<=m+1;j++){

			if(A[i][j]<-err || A[i][j]>err){
				if(j==m+1){
					printf("Imposibil\n");
					return 0;
				}

				sol[j]=A[i][m+1];

				for(int k = j+1; k <= m; ++k)
						sol[j] -= sol[k]*A[i][k];
				break;
			}
		}
	}
	for(int i=1;i<=m;i++)
		printf("%.8lf ",sol[i]);
	return 0;
}