Cod sursa(job #2487299)

Utilizator maria15Maria Dinca maria15 Data 4 noiembrie 2019 15:12:57
Problema Algoritmul lui Gauss Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.52 kb
#include <fstream>
#define dif 0.0000000001
#include <iomanip>

using namespace std;

ifstream fin("gauss.in");
ofstream fout("gauss.out");

int n, m, i, j, k, coef, t, h, sol;
double a[306][306], eps, x[305];

int main(){
    fin>>n>>m;
    for(i=1;i<=n;i++)
        for(j=1;j<=m+1;j++)
            fin>>a[i][j];
    i = 1, j = 1;
    while(i<=n && j<=m){
        k = 0;
        for(t=i;t<=n;t++)       /// pornesc din pozitia curenta(i,j) si merg pe coloana in jos, cautand sa vad daca toti coeficientii sunt nuli, ceea ce inseamna ca variabila j este libera
            if(a[t][j] != 0){
                k = t;
                break;
            }
        if(k == n+1){
            j++;
            continue;       /// nu am gasit niciun coefient nenul => variabila j este libera
        }
        if(k != i)      /// coeficientul curent este zero, deci trebuie schimbata ecuatia curenta cu alta
            /// schimb liniile i si k
            for(t=1;t<=m+1;t++)
                swap(a[i][t], a[k][t]);
        /// acum sunt in elementul (i, j) si stiu sigur ca acesta este nenul
        /// trebuie sa fac zero sub el
        /// mai intai, il fac egal cu unu
        for(t=j+1; t<=m+1; t++)
            a[i][t] /= a[i][j];
        a[i][j] = 1;
        /// abia acum fac zero sub el
        for(t=i+1; t<=n; t++){
            for(h=j+1;h<=m+1;h++)
                a[t][h] -= a[t][j]*a[i][h];
            a[t][j] = 0;
        }

        i++;
        j++;    /// ma deplasez pe diagonala in jos
    }

    /// acum REZOLV SISTEMUL
    /// pornind de la ultima ecuatie
    for(i=n;i>0;i--){
        /// caut primul coeficient diferit de zero
        coef = 0;
        for(j=1;j<=m+1;j++)
            if(-eps > a[i][j] || a[i][j] > eps){
                coef = j;
                break;
            }
        if(coef == m+2){    /// toti coeficientii sunt zero, deci ecuatia are o infinitate de solutii
            continue;
        }
        if(coef == m+1){
            sol = -1;
            break;
        }
        /// acum sunt in cazul in care am gasit un coeficient al unei variabile diferit de zero
        /// pot calcula variabila de pe pozitia (i, coef)
        x[coef] = a[i][m+1]/a[i][coef];
        /// acum il scad din toate ecuatiile de dinainte
        for(h=i-1;h>0;h--)
            a[h][m+1] -= x[coef]*a[h][coef];
    }
    if(sol == -1)
        fout<<"Imposibil";
    else{
        for(j=1;j<=m;j++)
            fout<<setprecision(10)<<fixed<<x[j]<<" ";
    }
    return 0;
}