Cod sursa(job #2489147)

Utilizator MihneaGhiraMihnea MihneaGhira Data 7 noiembrie 2019 22:42:51
Problema Algoritmul lui Gauss Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.71 kb
#include<fstream>
#include<iomanip>
#define constanta 0.001
using namespace std;
ifstream fin("gauss.in");
ofstream fout("gauss.out");
int n,m,i,j,k,aux,ok;
double solutii[305],a[305][305];
int main(){
    fin>>n>>m;
    for(i=1;i<=n;i++){
        for(j=1;j<=m+1;j++)
            fin>>a[i][j];
    }
    i=j=1;
    while(i<=n && j<=m){
        ///cautam un element nenul pe coloana la care suntem
        for(k=i;k<=n;k++)
            if(a[k][j]!=0)
                break;
        if(k==n+1){
            j++;
            continue;
        }
        if(k!=i){
            for(int h=1;h<=m+1;h++){
                aux=a[k][h];
                a[k][h]=a[i][h];
                a[i][h]=aux;
            }
        }
        /// acum avem sigur un element nenul( a[i][j] )
        /// impartim toata ecuatia la el nenul
        /// pt a simplifica calculul
        for(int h=j+1;h<=m+1;h++)
            a[i][h]/=a[i][j];
        a[i][j]=1;
        for(k=i+1;k<=n;k++){
            for(int h=j+1;h<=m+1;h++)
                a[k][h]-=a[i][h]*a[k][j];
            a[k][j]=0;
        }
        i++;
        j++;
    }
    ///rezolvam fiecare ecuatie pe rand
    ///(invers)
    for(i=n;i>=1;i--){
        for(j=1;j<=m+1;j++){
            if(a[i][j]>constanta || a[i][j]<-constanta)
                break;
        }
        if(j==m+1){
            ok=1;
            break;
        }
        if(j==m+2)
            continue;
        for(k=j+1;k<=m;k++)
            solutii[j]-=solutii[k]*a[i][k];
        solutii[j]+=a[i][m+1];
    }
    if(ok==1)
        fout<<"Imposibil";
    else{
        for(i=1;i<=m;i++)
            fout<<setprecision(10)<<fixed<<solutii[i]<<" ";
    }
    return 0;
}