Cod sursa(job #2209819)

Utilizator b10nd3Oana Mancu b10nd3 Data 4 iunie 2018 20:09:50
Problema Algoritmul lui Gauss Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
#include<fstream>
#include<algorithm>
#include<cmath>
#include<iostream>

using namespace std;

# define EPS 0.0000001
# define MAX 301
double a[MAX][MAX], x[MAX];
int m, n;

double argMax(int h, int k){
	double max=EPS, where=-1;	
	for(int i=h;i<=m;i++)
	  if(abs(a[i][k])>max){
	  	 max=abs(a[i][k]); where=i;
	  }
	return where;
}


void swapRows(int y, int x){
	for(int j=1;j<=n;j++)
		swap(a[x][j],a[y][j]);
}

void afisareMatrice(){
	for(int i=1;i<=m;i++){
	 	for(int j=1;j<=n;j++) cout<<a[i][j]<<" ";
	 	cout<<endl;
	 }
}

int main(){ 
     freopen("gauss.in","r",stdin); freopen("gauss.out","w",stdout);
	 int i, j, h, k;
	 double i_max, f;
	 
	 //citire date
	 scanf("%i %i",&m, &n); 
	 for(i=1;i<=m;i++)
	    for(j=1;j<=n+1;j++)
	      scanf("%lf",&a[i][j]);

	 //Gausssian Elimination 
	 n++;
	 h=1; k=1; 
	 while(h<=m && k<=n){ 
	 	i_max=argMax(h,k);
	 	if(i_max==-1) k++;
	 	else{
	 		swapRows(h,i_max);
	 		for(j=k+1;j<=n;j++)
			   a[h][j]=a[h][j]/a[h][k]; 
			a[h][k]=1; 
	 		for(i=h+1; i<=m; i++){
	 			f=a[i][k];
	 			a[i][k]=0;
	 			for(j=k+1;j<=n;j++)
	 			    a[i][j]=a[i][j]-a[h][j]*f*1.0;    
			 }
			 h++; k++;
		 } 
	 }  	 
	 
	 //aflare necunoscute
	 for(i=m;i>0;i--)
	   for(j=1;j<n;j++){
	   	 if(abs(a[i][j])>EPS){
	   	   if(j==n){
	   	   	     printf("Imposibil\n");
	   	   	     return 0;
			  }
			x[j]=a[i][n];
			for(k=j+1;k<=n-1;k++)
			   x[j]=x[j]-x[k]*a[i][k];
			break;   
		 }
	   }
  
	  //afisare rezultat
	  for(i=1;i<n;i++)
	    printf("%.8lf ",x[i]); 
	 	
	 return 0;
}