Cod sursa(job #2126091)

Utilizator refugiatBoni Daniel Stefan refugiat Data 9 februarie 2018 07:44:05
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
FILE* si=fopen("gauss.in","r");
FILE* so=fopen("gauss.out","w");
const double nul=0.00000000001;
double v[305][305];
double sol[305];
int main()
{
    int n,m;
    fscanf(si,"%i %i",&n,&m);
    m++;
    int i,j;
    for(i=1;i<=n;++i)
        for(j=1;j<=m;++j)
            fscanf(si,"%lf",&v[i][j]);

    int k,l;
    for(i=1,j=1;i<=n&&j<m;++j)
    {
        for(k=i;k<=n&&!(v[k][j]>nul||v[k][j]<-nul);++k);
        if(k==n+1)
            continue;

        swap(v[i],v[k]);

        for(l=j+1;l<=m;++l)
            v[i][l]=v[i][l]/v[i][j];
        v[i][j]=1;
        for(k=i+1;k<=n;++k)
        {
            for(l=j+1;l<=m;++l)
                v[k][l]=v[k][l]-v[i][l]*v[k][j];
            v[k][j]=0;
        }
        ++i;
    }
    bool bun=true;

    for(i=n;i&&bun;--i)
    {
        for(k=1;k<=m&&!(v[i][k]>nul||v[i][k]<-nul);++k);

        if(k==m)
        {
            bun=false;
            break;
        }
        sol[k]=v[i][m];
        for(j=k+1;j<m;++j)
        {
            sol[k]-=sol[j]*v[i][j];
        }
    }
    if(bun)
    {
        for(i=1;i<m;++i)
        {
            fprintf(so,"%.10f ",sol[i]);
        }
    }
    else
    {
        fprintf(so,"Imposibil");
    }
    return 0;
}