Cod sursa(job #1721364)

Utilizator cella.florescuCella Florescu cella.florescu Data 25 iunie 2016 14:16:46
Problema Algoritmul lui Gauss Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <cstdio>
#define MAXN 300
#define EPS 0.0000000001

using namespace std;

double mat[MAXN][MAXN+1], sol[MAXN];

inline double myabs(double val){
  if(val<0)
    return -val;
  return val;
}

int main()
{
    FILE *fin, *fout;
    double aux;
    int n, m, i, j, k, x, imp;
    fin=fopen("gauss.in", "r");
    fscanf(fin, "%d%d", &n, &m);
    for(i=0; i<n; i++)
      for(j=0; j<=m; j++)
        fscanf(fin, "%lf", &mat[i][j]);
    fclose(fin);
    i=j=0;
    while(i<n && j<m){
      for(k=i; k<n && myabs(mat[k][j])<EPS; k++);
      if(k>=n)
        ++j;
      else{
        if(i<k)
          for(x=0; x<=m; x++){
            aux=mat[i][x];
            mat[i][x]=mat[k][x];
            mat[k][x]=aux;
          }
        for(k=j+1; k<=m; k++)
          mat[i][k]/=mat[i][j];
        mat[i][j]=1;
        for(k=i+1; k<n; k++){
          for(x=j+1; x<=m; x++)
            mat[k][x]-=mat[k][j]*mat[i][x];
          mat[k][j]=0;
        }
        ++i; ++j;
      }
    }
    imp=0;
    for(i=n-1; i>=0 && imp==0; i--)
      for(j=0; j<=m && imp==0; j++)
        if(myabs(mat[i][j])>EPS){
          if(j==m)
            imp=1;
          sol[j]=mat[i][m];
          for(k=j+1; k<m; k++)
            sol[j]-=mat[i][k]*sol[k];
          j=m+1;
        }
    fout=fopen("gauss.out", "w");
    if(imp)
      fprintf(fout, "Imposibil");
    else
      for(i=0; i<m; i++)
        fprintf(fout, "%lf ", sol[i]);
    fprintf(fout, "\n");
    fclose(fout);
    return 0;
}