Cod sursa(job #1283801)

Utilizator danielmaxim95FMI Maxim Daniel danielmaxim95 Data 6 decembrie 2014 00:45:30
Problema Algoritmul lui Gauss Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 kb
#include <stdio.h>
#include <math.h>
#include <utility>
using namespace std;

const float E=1e-12;

int n,m;
float v[301][302],s[301];

int linie_fara_zero(int ls, int c)
{
    for(int i=ls; i<=n; i++)
        if(fabsf(v[i][c]!=0))
            return i;
    return 0;
}

bool gauss()
{
    int lp=1, cp=1,i,j,k,lfz;
    bool ok;
    while ((lp<=n) && (cp<=m))
    {
        ok=true;
        if(fabsf(v[lp][cp]==0))
        {
            lfz=linie_fara_zero(lp,cp);
            if(!lfz)
            {
                cp++;
                ok=false;
            }
            else
                swap(v[lfz],v[lp]);
        }

        if(ok)
        {
            for(i=cp+1; i<=m+1; i++)
                v[lp][i]/=v[lp][cp];
        v[lp][cp]=1;
        for (i=lp+1; i<=n; i++)
        {
            for(j=cp+1; j<=m+1; j++)
                v[i][j]-=v[lp][j]*v[i][cp];
            v[i][cp]=0;
        }
        lp++; cp++;
        }
    }

    for(i=n-1; i>=1; i--)
    {
        j=1;
        while(fabsf(v[i][j]==0)) j++;
        if(j==m+1)
            return false;
        s[j]=v[i][m+1];
        for(k=j+1; k<=m; k++)
            s[j]-=s[k]*v[i][k];
    }
    return true;
}

void afiseaza(bool posibil)
{
    FILE *f=fopen("gauss.out","w");
    if(!posibil)
        fprintf(f,"Imposibil");
    else
        for(int i=1; i<=m; i++)
            fprintf(f,"%.7f ",s[i]);
    fclose(f);
}

void citeste()
{
    FILE *f=fopen("gauss.in", "r");
    fscanf(f, "%i%i", &n, &m);
    for(int i=1; i<=n; i++)
        for(int j=1; j<=m+1; j++)
            fscanf(f, "%f", &v[i][j]);
    fclose(f);
}

int main()
{
    citeste();
    afiseaza(gauss());
    return 0;
}