Cod sursa(job #2393179)

Utilizator SoranaAureliaCatrina Sorana SoranaAurelia Data 30 martie 2019 22:56:58
Problema Algoritmul lui Gauss Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.06 kb
#include <cstdio>
#include <fstream>
#include <cmath>
#define eps 0.00000000000005
using namespace std;
int n, m; // n ecuatii m necunoscute
double a[305][305];
double sol[305];

void schimb(int i){
    for(int j=i+1;j<n;++j)
        if(fabs(a[j][i])>eps){
            swap(a[i],a[j]);
            break;
        }
}
void inmultire_linie(int linie,int coloana){ //inmultesc linia pentru a face elementul de pe colana 1

    //toate elementele din fata coloanei sunt deja 0
    if(a[linie][coloana]<eps)
        schimb(linie);
    double cu_ce_impart=a[linie][coloana];

    for(int j=coloana; j<=m; j++){
        a[linie][j]=a[linie][j]/cu_ce_impart;
    }

}

void afisare(){
    for(int i=1; i<=n; i++){
        for(int j=1; j<=m; j++)
            printf("%lf ",a[i][j]);
        printf("\n");
    }

}

void rez(){

    for(int i=1; i<=n; i++){
        inmultire_linie(i,i);

        for(int j=i+1; j<=n; j++){
            double cat=-a[j][i];
            for(int col=1; col<=m; col++)
                a[j][col]=a[j][col]+cat*a[i][col];
        }
    }
    int ok=1;
    for(int i=n; i>=1; i--){
        double sols=a[i][m];
        for(int j=i+1; j<m; j++)
            sols=sols-sol[j]*a[i][j];
        sol[i]=sols;
    }

    //afisare();

}

int main() {

    freopen("gauss.in", "r", stdin);
    freopen("gauss.out", "w", stdout);
    scanf("%d %d", &n, &m);

    for(int i=1; i<=n; i++){
        for(int j=1; j<=m+1; j++){
            scanf("%lf",&a[i][j]);
        }
    }
    if(n>m){
        m++;
        int aux=n;
        n=m-1;
        rez();
        bool ok=0;
        for(int i=n; i<=aux; i++){
            double soll=0;
            for(int j=1; j<=m; j++)
                soll=soll+a[i][j]*sol[j];
            if(soll!=a[i][m]){
                ok=1;
                break;
            }
        }
        if(ok==1)
            printf("Imposibil");
        else for(int j=1; j<m; j++)
            printf("%lf ", sol[j]);
    }
    else if(n==m){
        m++;
        rez();
        for(int j=1; j<m; j++)
            printf("%lf ", sol[j]);
    }
    else printf("Imposibil");


    return 0;
}