Cod sursa(job #3163985)

Utilizator andreea678Rusu Andreea-Cristina andreea678 Data 1 noiembrie 2023 20:34:26
Problema Algoritmul lui Gauss Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.97 kb
#include <iostream>
#include <fstream>
#include <iomanip>
#define EPS 0.0000001
using namespace std;

ifstream fin("gauss.in");
ofstream fout("gauss.out");
int n, m;
double mat[405][405];
double sol[405];

void sterge(int poz) {
    for (int i=poz; i<=n-1; ++i) {
        for (int j=1; j<=m+1; ++j) {
           mat[i][j]=mat[i+1][j];
        }
    }
    n--;
}
void mutare(int poz) {
    n++;
    for (int i=n; i>=poz; --i) {
        for (int j=1; j<=m+1; ++j) {
           mat[i+1][j]=mat[i][j];
        }
    }
}
bool valid(int lin) {
    bool OK=true;
    for (int i=1; i<=m; ++i) {
        if (mat[lin][i]!=0) {
            OK=false;
        }
    }
    if (OK==true && mat[lin][m+1]!=0) {
        return false;
    }
    return true;
}
void afisare(){
    for (int i=1; i<=n; ++i) {
        for (int j=1; j<=m+1; ++j) {
            fout << mat[i][j] << ' ';
        }
        fout <<'\n';
    }
}
void schimba(int lin1, int lin2) {
    for (int i=1; i<=m+1; ++i) {
        swap(mat[lin1][i],mat[lin2][i]);
    }
}
void imparte(int lin, int col) {
    for (int i=1; i<=m+1; ++i) {
        mat[lin][i]=mat[lin][i]/mat[lin][col];
    }
}
void asezare() {
    for (int j=2; j<=n; ++j) {
        for (int i=1; i<=m-1; ++i) {
            if (mat[j][i]==0 && mat[j][i+1]!=0) {
                schimba(j, i+1);
            }
        }
    }
}
int main()
{
    fin >> n >> m;
    for (int i=1; i<=n; ++i) {
        for (int j=1; j<=m+1; ++j) {
            fin >> mat[i][j];
        }
    }
    int i=1, j=1,k;
    double aux;
    while (i<=n && j<=m) {
        for(k = i; k <= n; ++k) {
            if(mat[k][j]<-EPS || mat[k][j]>EPS) {
                break;
            }
         }
        if(k == n+1)
        {
            ++j;
            continue;
        }
         if(k != i) {
            for(int l = 1; l <= m+1; ++l){
                aux = mat[i][l];
                mat[i][l] = mat[k][l];
                mat[k][l] = aux;
            }
         }
          for(int l = j+1; l <= m+1; ++l) {
            mat[i][l] = mat[i][l] / mat[i][j];
          }
        mat[i][j] = 1;
        for(int u = i+1; u <= n; ++u) {
            for(int l = j+1; l <= m+1; ++l) {
            mat[u][l] -= mat[u][j] * mat[i][l];
            }
        mat[u][j] = 0;
        }
        ++i;
        ++j;
        for(int i = n; i>0; --i) {
            for(int j = 1; j <= m+1; ++j) {
                if(mat[i][j]>EPS || mat[i][j]<-EPS) {
                    if (j==m+1) {
                        fout << "Imposibil";
                        return 0;
                    }
                     sol[j] = mat[i][m+1];
                    for(int k = j+1; k <= m; ++k) {
                        sol[j] -= sol[k] * mat[i][k];
                    }
                    break;
                }
            }
        }
    }
    for (int i=1; i<=m; ++i) {
        fout <<fixed<< setprecision(10) << sol[i] << ' ';
    }
    return 0;
}