Cod sursa(job #2224660)

Utilizator Laura_CorneiLaura Maria Cornei Laura_Cornei Data 24 iulie 2018 20:02:40
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb
#include <fstream>
#include <iomanip>
using namespace std;
int n, m;
double a[305][305], sol[305], lim=1e-11;
fstream f1("gauss.in", ios::in);
fstream f2("gauss.out", ios::out);
int main()
{
    int i, j, l, k, ind;
    f1>>n>>m;
    for(i=1; i<=n; i++)
        for(j=1; j<=m+1; j++)
            f1>>a[i][j];
    i=1;
    for(j=1; j<=m; )
    {
        ///gasire indice linie cu valoare nenula pe coloana j
        ind=0;
        for(k=i; k<=n; k++)
            if((-lim>=a[k][j])||(a[k][j]>=lim))
                {ind=k;break;}
        ///coloana de 0
        if(ind==0) {j++; continue;}  ///x[j] va fi 0 (ales arbitrar)
        ///interschimb i cu ind, elemente de dinainte de j ambele linii =0
        if(i!=ind)
        for(k=j; k<=m+1; k++)
        {
            long double val=a[ind][k];
            a[ind][k]=a[i][k];
            a[i][k]=val;
        }
        ///impartim linia i la a[i][j];
        for(k=j+1; k<=m+1; k++)
            a[i][k]/=a[i][j]; a[i][j]=1;
        ///face 0-uri sub a[i][j]
        for(l=i+1; l<=n; l++)
        {
            for(k=j+1; k<=m+1; k++)
                 a[l][k]-=a[l][j]*a[i][k];
            a[l][j]=0;
        }
        i++; j++;
    }
    for(i=n; i>=1; i--)
    {
       for(j=1; j<=m; j++)
          if((-lim>=a[i][j])||(a[i][j]>=lim)) ///primul el nenul (=1)
            {
                sol[j]=a[i][m+1];
                for(k=m; k>j; k--)
                    sol[j]-=a[i][k]*sol[k];
                break;
            }
       if((j==m+1)&&((-lim>=a[i][m+1])||(a[i][m+1]>=lim))) {f2<<"Imposibil\n";return 0;}
    }
    for(i=1; i<=m; i++)
        f2<<fixed<<setprecision(10)<<sol[i]<<' ';
    return 0;
}