Cod sursa(job #2427669)

Utilizator Leonard123Mirt Leonard Leonard123 Data 1 iunie 2019 14:32:17
Problema Algoritmul lui Gauss Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.5 kb
#include<fstream>
#include<iomanip>
using namespace std;

ifstream cin("gauss.in");
ofstream cout("gauss.out");
#define epsilon 0.0000001
#define maxn 305
int N,M;
double sistem[maxn][maxn], result[maxn];

int solve(){
    for(int i=N; i>0; --i)
      for(int j=1; j<=M+1; ++j){
        if(sistem[i][j]< -epsilon || epsilon<sistem[i][j]){
          if(j==M+1){
          cout<<"Imposibil\n";
          return 0;
        }
          result[j]=sistem[i][M+1];
            for(int k=j+1; k<=M; k++)
                result[j]-=result[k]*sistem[i][k];
            break;
        }
      }
    for(int i=1; i<=M; i++)
      cout<<fixed<<setprecision(8)<<result[i]<<' ';
    cout<<'\n';
}

void gauss_algorithm(){
  int aux, i=1, j=1,k;
  while(i<=N && j<=M){
    for(k=i; k<=N; ++k)
      if(sistem[k][j]<-epsilon || epsilon<sistem[k][j])
        break;
    if(k==N+1){
      ++j;
      continue;
    }
    if(k!=i)
      for(int l=1; l<=M+1; ++l){
        aux=sistem[i][l];
        sistem[i][l]=sistem[k][l];
        sistem[k][l]=aux;
      }
    for(int l=j+1; l<=M+1; ++l)
      sistem[i][l]/=sistem[i][j];
    sistem[i][j]=1;
    for(int u=i+1; u<=N; ++u){
      for(int l=j+1; l<=M+1; ++l)
          sistem[u][l]-=sistem[u][j]*sistem[i][l];
      sistem[u][j]=0;
      }
    i++; j++;
  }
}

int main(){
      cin>>N>>M;
      for(int i=1; i<=N; i++)
        for(int j=1; j<=M+1; j++)
          cin>>sistem[i][j];
      gauss_algorithm();
      solve();
  return 0;
}