Cod sursa(job #1610835)

Utilizator DrumeaVDrumea Vasile DrumeaV Data 23 februarie 2016 19:18:47
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb
#include <fstream>
#include <algorithm>
#include <iomanip>

using namespace std;

const int Mn = 3e2 + 3;
const double zero = 0.001;

int n, m;
double sol[Mn];
double ar[Mn][Mn];

int main()
{
    ifstream fi("gauss.in");
    ofstream fo("gauss.out");

    fo << fixed << setprecision(10);
    fi >> n >> m;
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m + 1; j++)
            fi >> ar[i][j];

    int i = 1, j = 1, l;
    for (; i <= n && j <= m;)
    {
        for (l = i; l <= n; l++)
            if (ar[l][j] < -zero || ar[l][j] > zero)
               break;

        if (l > n)
        {
            j++;
            continue;
        }

        if (l != i)
           for (int it = 1; it <= m + 1; it++)
               swap(ar[i][it], ar[l][it]);

        for (int it = j + 1; it <= m + 1; it++)
            ar[i][it] /= ar[i][j];

        ar[i][j] = 1;
        for (int rw = i + 1; rw <= n; rw++)
        {
            for (int cl = j + 1; cl <= m + 1; cl++)
                ar[rw][cl] -= ar[rw][j] * ar[i][cl];

            ar[rw][j] = 0;
        }

        i++; j++;
    }

    for (int i = n; i > 0; i--)
        for (int j = 1; j <= m + 1; j++)
            if (ar[i][j] < -zero || ar[i][j] > zero)
            {
               if (j == m + 1)
               {
                   fo << "Imposibil\n";
                   return 0;
               }

               sol[j] = ar[i][m + 1];
               for (int it = j + 1; it <= m; it++)
                   sol[j] -= sol[it] * ar[i][it];

               break;
            }

     for (int i = 1; i <= m; fo << sol[i] << " ", i++);

     fo << "\n";

  return 0;
}