Cod sursa(job #1330516)

Utilizator andreismara97Smarandoiu Andrei andreismara97 Data 30 ianuarie 2015 19:06:21
Problema Algoritmul lui Gauss Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
#include<algorithm>
#include<cstdio>
#include<iomanip>
using namespace std;

#define Nmax 302
#define EPS 0.0000000001

double A[Nmax][Nmax], X[Nmax];
int N, M;

int main ()
{
    freopen("gauss.in","r",stdin);
    freopen("gauss.out","w",stdout);

    scanf("%d %d", &N,&M);
    for(int i=1;i<=N;i++)
        for(int j=1;j<=M+1;j++)
            scanf("%lf", &A[i][j]);
    for(int k=1; k<N && k<=M; k++)
    {
        int nr=N;
        for(int i=k; i<=nr;i++)
            if(A[i][k] <EPS && A[i][k]> -EPS)
            {
                for(int u=k; u<=M+1; u++)
                    swap( A[nr][u], A[i][u]);
                nr--;
                i--;
            }
        if(nr==0)
        {
            printf("Imposibil");
            return 0;
        }

        for(int i=k+1; i<=N; i++)
        {
            if(A[i][k]!=0)
            {
                double aux= A[k][k] / A[i][k];
                for(int j=k; j<=M+1; j++)
                {
                    A[i][j] *=aux;
                    A[i][j] -=A[k][j];
                }
            }
        }
    }

    for(int i=N; i>=1; i--)
        for(int j=1; j<=M+1; j++)
            if( A[i][j]>EPS || A[i][j] <-EPS)
            {
                if(j==M+1)
                {
                    printf("Imposibil");
                    return 0;
                }

                X[j]= (double)A[i][M+1];
                for(int u=j+1; u<=M; ++u)
                    X[j] = X[j] - A[i][u]*X[u];

                X[j] = X[j]/A[i][j];
                break;
            }
    for(int i=1;i<=M;i++)
        printf("%.10lf ", X[i]);
    return 0;
}