Cod sursa(job #1802856)

Utilizator medicinedoctoralexandru medicinedoctor Data 10 noiembrie 2016 18:28:20
Problema Algoritmul lui Gauss Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
#define as a.size()
#define xs x.size()

using namespace std;

vector <vector <double> > a;
vector <double> s;
//ifstream cin("gauss.in");
//ofstream cout("gauss.out");

void lire(vector <vector <double> > &x)
{
    int n,m;
    cin >> n >> m;
    x.resize(n);
    for (int i=0; i<xs; i++)
    {
        x[i].resize(m+1);
        for (int j=0; j<x[i].size(); j++)
        {
            cin >> x[i][j];
        }
    }
}

void direct(vector <vector <double> > &x)
{
    int k; double r;
    for (int i=0; i<xs-1; i++)
    {
        if (x[i][i]==0)
        {
            k=i;
            for (int j=i+1; j<xs; j++)
            {
                if (x[j][i]!=0) k=j;
            }
            if (k==i) return; else swap(x[i],x[k]);
        }
        for (int j=i+1; j<xs; j++)
        {
            r=-x[j][i]/x[i][i];
            for (k=i; k<xs+1; k++)
            {
                x[j][k]+=x[i][k]*r;
            }
        }
    }
}

void invers(vector <double> &q)
{
    double s;
    for (int i=as-1; i>=0; i--)
    {
        s=0;
        for (int j=i+1; j<a[0].size(); j++)
        {
            s=s+a[i][j]*q[j];
        }
        if (a[i][i]) q[i]=(a[i][as]-s)/a[i][i]; else q[i]=0;
    }
}

main()
{
    lire(a);
    direct(a);
    s.resize(a.size());
    invers(s);
    copy(s.begin(),s.end(),ostream_iterator<double> (cout," "));
}