Cod sursa(job #3184355)

Utilizator MilitaruMihai2022Millitaru Mihai MilitaruMihai2022 Data 15 decembrie 2023 17:17:36
Problema Algoritmul lui Gauss Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.6 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("gauss.in");
ofstream g("gauss.out");

int n,m,k;
long double s[302][302],x[302];

int main()
{
    f>>n>>m;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m+1;j++)
        f>>s[i][j];
    long double EPS=1e-10;
  for(int i=1,j=1,k;i<=n && j<=m;)
    {
    for(k=i;k<=n; ++k)
      if(s[k][j]!=0) break;//cautam o linie pe care sa o folosim pentru a forma zerouri pe coloana j
    if(k>n)//nu am gasit nicio linie pentru care s[i][j] e nenul deci trecem la urmatoarea coloana linia i nefiind finala
      ++j;
    if(k!=i)
        for(int l=1; l<=m+1; ++l)
            swap(s[i][l],s[k][l]);//interschimbam liniile pentru a avea pe linia i si coloana j un element nenul
    for(k=i+1; k<=n; ++k)
      for(int l=m+1; l>=j; --l)
        s[k][l]-=((s[k][j]*s[i][l])/s[i][j]);//aplicam transformarea pentru fiecare linie mai mare ca i pentru a avea 0 pe coloana j sub linia i
    ++i; ++j;
  }
//aflam necunoscutele
  for(int i=n; i>0;--i)
    for(int j=1; j<=m+1; ++j)
        if(fabs(s[i][j])>EPS)
    {
      //pentru ca e posibil sa avem mai multe ecuatii decat necunoscute
      //cautam pe fiecare linie primul coeficient nenul, acestia aparand de la dreapta la stanga
      if(j==m+1) {//linia nu are coeficienti nenuli deci nu avem solutie
        g<<"Imposibil";
        return 0;
      }
      x[j]=s[i][m+1];
      for(int k=j+1; k<=m; ++k) x[j]-=s[i][k]*x[k];
      x[j]/=s[i][j];
      break;//trecem la linia precedenta
    }
    for(int i=1;i<=m;i++)
        g<<fixed<<setprecision(8)<<x[i]<<' ';
    return 0;
}