Cod sursa(job #3238861)

Utilizator Bianca2507Negret Bianca Bianca2507 Data 31 iulie 2024 11:01:47
Problema Algoritmul lui Gauss Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.43 kb
#include <fstream>
#include <cmath>
#include <iomanip>
#define Eps 0.0000000001
using namespace std;
ifstream cin("gauss.in");
ofstream cout("gauss.out");
int n,m;
double a[305][305],x[305];
int main()
{
    cin>>n>>m;
    for(int i=1; i<=n; i++)
        for(int j=1; j<=m+1; j++)
            cin>>a[i][j];
    int i=1,j=1;///i=ecuatie ,j=necunoscuta
    while(i<=n &&j<=m)
    {
        int t=i;///cautam pe coloana j linia x(i<=x) astfel incat a[x][j]!=0
        for(t=i; t<=n; t++)
            if(a[t][j]!=0)
                break;
        if(t==n+1)///nu exista acea linie si inseamna ca e variabila  libera=> poate fi orice valoare ,iar noi ii dam valoarea 0
        {
            j++;
            continue;
        }
        if(t!=i)///daca am gasit acea linie o interschimbam cu linia curenta
        {
            for(int k=1; k<=m+1; k++)
                swap(a[i][k],a[t][k]);
        }
        ///eliminam acea necunoscuta din celelalte ecuatii
        ///prima oara impartim toata linia i cu a[i][j] pentru a-l face pe a[i][j] =1
        for(int k=j+1; k<=m+1; k++)
            a[i][k]/=a[i][j];
        a[i][j]=1;
        ///pentru a elimina aceasta necunoscuta de pe linia x trebuie sa inmultim linia i cu -a[x][j] si sa o adunam la linia x
        for (int k=i+1; k<=n; k++)
        {
            for(int s=j+1; s<=m+1; s++)
                a[k][s]=a[k][s]-a[i][s]*a[k][j];
            a[k][j]=0;
        }
        i++;
        j++;
    }
    ///luam in ordine inversa ecuatiile(de la 1 la n)
    for(int i=n; i>=1; i--)
    {
        ///aflam prima pozitie nenula
        int j=1;
        for(j=1; j<=m+1; j++)
            if(a[i][j]>Eps ||a[i][j]<-Eps)
            {
                if(j==m+1)///toate necunoscutele sunt 0 ,doar termenul liber e nenul =>nu avem solutie
                {
                    cout<<"Imposibil";
                    return 0;
                }
                x[j]=a[i][m+1];
                for(int k=j+1;k<=m;k++)
                    x[j]=x[j]-x[k]*a[i][k];///scadem din termenul liber necunoscutele pe care le-am aflat anterior inmultite cu coeficientii lor si asa aflam solutia

                break;
            }
        if(j==m+2)///toate necunoscutele sunt 0,iar termenul liber e si el 0(e o combinatie liniara a celorlalte ecuatii)
            continue;

    }
    for(int i=1; i<=n; i++)
        cout<<fixed<<setprecision(10)<<x[i]<<" ";
    return 0;
}