Cod sursa(job #812518)

Utilizator mirceadinoMircea Popoveniuc mirceadino Data 13 noiembrie 2012 22:36:02
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 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||a[k][j]<-eps) break;
        }
        if(k!=n+1)
        {
            x=k;
            for(k=1;k<=m+1;k++)
            {
                swap(a[i][k],a[x][k]);
            }
            for(k=j+1;k<=m+1;k++)
            {
                a[i][k]=a[i][k]/a[i][j];
            }
            a[i][j]=1;
            for(k=i+1;k<=n;k++)
            {
                for(l=j+1;l<=m+1;l++)
                {
                    a[k][l]=a[k][l]-a[k][j]*a[i][l];
                }
                a[k][j]=0;
            }
            i++;
        }
    }
    for(i=n;i>=1;i--)
    {
        for(j=1;j<=m+1;j++)
        {
            if(a[i][j]>eps||a[i][j]<-eps)
            {
                if(j==m+1) {printf("Imposibil"); return 0;}
                sol[j]=a[i][m+1];
                for(k=j+1;k<=m;k++)
                {
                    sol[j]-=a[i][k]*sol[k];
                }
                break;
            }
        }
    }
    for(i=1;i<=m;i++) printf("%.10f ",sol[i]);
    return 0;
}