Cod sursa(job #2487296)

Utilizator mirceaisherebina mircea mirceaishere Data 4 noiembrie 2019 15:08:54
Problema Algoritmul lui Gauss Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.14 kb
#include <fstream>
#include <iomanip>
#include <iostream>
#define EPS 0.000000001
using namespace std;
ifstream fin("gauss.in");
ofstream fout ("gauss.out");

double a[110][110], sol[110], suma;
int n, m, t, i, j, ii, jj, aux, indice;

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){

        /// caut element pe coloana diferit de 0
        for(ii=1; ii<=n; ii++){
            if(a[ii][j]){
                break;
            }
        }
        if(ii==n+1){
            /// element liber
            j++;
        }else{
            /// am gasit element nenul
            /// schimbam linia daca este cazul
            if(ii!=i){
                for(aux=1; aux<=m+1; aux++){
                    swap(a[i][aux], a[ii][aux]);
                }
            }
            /// a[i][j] este elementul nenul
            /// impartim elementele de pe linie la a[i][j]
            for(jj=j+1; jj<=m+1; jj++){
                a[i][jj]=a[i][jj]/a[i][j];
            }
            a[i][j]=1;
            /// obtinem zero sub acesta
            for(ii=i+1; ii<=n; ii++){
                for(jj=j+1; jj<=m+1; jj++){
                    a[ii][jj]=a[ii][jj]-a[i][jj]*a[ii][j];
                }
                a[ii][j]=0;
            }
            i++;
            j++;
        }
    }
    for(i=n; i>0; i--){
        /// verific linia
        indice=0;
        for(j=1; j<=m; j++){
            if(a[i][j]>EPS || a[i][j]<-EPS){
                indice=j;
                break;
            }
        }
        if(indice==0){
            /// linia este goala
            if(a[i][m+1]){
                fout<<"Imposibil";
                return 0;
            }else{
                /// infinitate de solutii, luam 0
            }
        }else{
            suma=0;
            for(j=indice+1; j<=m; j++){
                suma+=a[i][j]*sol[indice];
            }
            sol[indice]=a[i][m+1]-suma;
        }
    }
    for(i=1; i<=m; i++){
        fout<<setprecision(10)<<fixed<<sol[i]<<" ";
    }
}