Cod sursa(job #812383)

Utilizator mirceadinoMircea Popoveniuc mirceadino Data 13 noiembrie 2012 20:13:52
Problema Algoritmul lui Gauss Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include<cstdio>
#include<algorithm>
#define eps 0.0000001
using namespace std;
double a[305][305],r,sol[305];
int i,j,k,l,n,m,q,x;
int main()
{
    freopen("gauss.in","r",stdin);
    freopen("gauss.out","w",stdout);
    scanf("%d %d",&n,&m);
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=m+1;j++)
        {
            scanf("%d",&q);
            a[i][j]=(double)q;
        }
    }
    for(i=1,j=1;i<=n&&j<=m;j++)
    {
        for(k=i;k<=n;k++)
        {
            if(a[k][j]>=eps) break;
        }
        if(k!=n+1)
        {
            x=k; r=a[x][k];
            for(k=1;k<=m+1;k++)
            {
                swap(a[i][k],a[x][k]);
                a[i][k]=a[i][k]/r;

            }
            for(k=i+1;k<=n;k++)
            {
                r=a[k][j]/a[i][j];
                for(l=j;l<=m+1;l++)
                {
                    a[k][l]=a[k][l]-r*a[i][l];
                }
            }
            i++;
        }
    }
    for(i=n,q=m;i>=1&&q>=1;i--)
    {
        for(j=1;j<=m+1&&(!(a[i][j]));j++);
        if(j==m+2&&a[i][m+1]>=eps) {printf("Imposibil"); return 0;}
        if(a[i][q]==0) continue;
        sol[q]=a[i][m+1]/a[i][q];
        for(j=q+1;j<=n;j++)
        {
            sol[q]-=a[i][j]*sol[j];
        }
        q--;

    }
    for(i=1;i<=m;i++) printf("%.10f ",sol[i]);
}