Cod sursa(job #2086344)

Utilizator luanastLuana Strimbeanu luanast Data 11 decembrie 2017 21:48:48
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.25 kb
#include <fstream>
#include <iomanip>
using namespace std;
#define epsilon 0.000000001
ifstream fin ("gauss.in");
ofstream fout ("gauss.out");
int n,m,i,k,j,t,ok;
double sol[301],a[310][310],aux;
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){
        if(a[i][j]){
            //imparti peste tot cu primul ca sa ai coef 1 la primul
            for(k=m+1;k>=j+1;k--)
                a[i][k]/=a[i][j];
            a[i][j]=1;
            //scazi linia k cu linia i * primul de pe linia k ca sa se reduca primul de pe linia k
            for(k=i+1;k<=n;k++){
                for(t=j+1;t<=m+1;t++){
                    a[k][t]-=a[k][j]*a[i][t];
                }
                a[k][j]=0;
            }
            ++i;
            ++j;
        }
        else{
            ok=0;
            //cautam prima linie cu xj nenul
            for(k=i+1;k<=n;k++)
                if(a[k][j]){
                    ok=1;
                    break;
                }
            //daca coloana e 0 => xj termen liber, trecem mai departe
            if(!ok){
                ++j;
            }
            else{
                //altfel, interschimbam prima linie cu xj>=1 cu linia curenta
                for(t=1;t<=m+1;t++){
                    aux=a[k][t];
                    a[k][t]=a[i][t];
                    a[i][t]=aux;
                }
            }
        }
    }
    for(i=n;i>=1;i--){
        //verificam daca a[i][j] e 0 (cu eroare epsilon)
        for(j=1;j<=m+1;j++)
            if(a[i][j]>epsilon || a[i][j]<(-epsilon))
                break;
        //toata linia 0
        if(j==m+2)
            continue;
        //toata linia 0 in afara de ultima valoare, cea de dupa = ; deci ec arata ceva gen 0=a
        //=> ec nu are sol
        if(j==m+1){
            fout<<"Imposibil";
            return 0;
        }
        sol[j]=a[i][m+1];
        //aici facem schema unde aflam sol de fiecare xj
        //adica sol = m+1 - sol de dupa j * coef lor din ecuatia i
        for(k=j+1;k<=m;k++)
            sol[j]-=sol[k]*a[i][k];
    }
    for(i=1;i<=m;i++){
        fout<<setprecision(10)<<fixed<<sol[i]<<" ";
    }
    //fin
}