Cod sursa(job #1369667)

Utilizator sorynsooSorin Soo sorynsoo Data 3 martie 2015 10:31:40
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.98 kb
#include <fstream>
#include <iomanip>
#include <cstdio>
using namespace std;
#define MAXIM 310
#define EPS 0.0000001
ifstream cin("gauss.in");
int n,m,k,i,j,i2,j2;
double mat[MAXIM][MAXIM],x[MAXIM],aux;
/*
void scrie()
{
    for(int i=1; i<=n; i++)
    {
        for(int j=1; j<=m+1; j++)
            cout<<mat[i][j]<<" ";
        cout<<"\n";
    }
    cout<<"\n\n";
}
*/
int main()
{
    cin>>n>>m;
    for(i=1; i<=n; i++)
        for(j=1; j<=m+1; j++)
            cin>>mat[i][j];

    i=1; j=1;
    while(i<=n && j<=m)
    {
        //1 : caut linie pe coloana curenta unde mat[k][j] != 0
        for(k=i; k<=n; k++)
            if(mat[k][j]>-EPS || mat[k][j]<EPS)
                break;

        //2 : daca nu gasesc linia
        if(k>n)
        {
            j++;
            continue;
        }

        //3 : swap-ul intre mat[k][j2] si mat[i][j2] in incercarea de a face 0 sub diagonala principala
        if(k!=i)
            for(j2=1; j2<=m+1; j2++)
                swap(mat[k][j2],mat[i][j2]);

        //4 : impart mat[i][1,2...m+1] la mat[i][j]
        for(j2=j+1; j2<=m+1; j2++)
            mat[i][j2]/=mat[i][j];
        mat[i][j]=1;

        //5 : pt ecuatiile i+1,i+2..n formez 0 pe coloana j
        for(i2=i+1; i2<=n; i2++)
        {
            for(j2=j+1; j2<=m+1; j2++)
                mat[i2][j2]-= mat[i2][j] * mat[i][j2];

            mat[i2][j]=0;
        }
        i++; j++;
    }
    freopen("gauss.out","w",stdout);
     for(int i = n; i>0; i--)
        for(int j = 1; j <= m+1; j++)
            if(mat[i][j]>EPS || mat[i][j]<-EPS)
            {
                if(j == m+1)
                {
                    printf("Imposibil\n");
                    return 0;
                }

                x[j] = mat[i][m+1];
                for(int k = j+1; k <= m; ++k)
                    x[j] -= x[k] * mat[i][k];

                break;
            }

    for(int i = 1; i <= m; i++)
        printf("%.8lf ", x[i]);
}