Cod sursa(job #2482909)

Utilizator aurelionutAurel Popa aurelionut Data 29 octombrie 2019 01:28:55
Problema Algoritmul lui Gauss Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2 kb
#include <iomanip>
#include <algorithm>
#include <fstream>

using namespace std;

const int NMAX = 305;
const double EPS = 0.0000001;
int N, M;
double a[NMAX][NMAX], sol[NMAX];

int main()
{
    ifstream fin("gauss.in");
    ofstream fout("gauss.out");
    fin >> N >> M;
    for (int i = 1;i <= N;++i)
        for (int j = 1;j <= M + 1;++j)
            fin >> a[i][j];
    int i = 1, j = 1, k;
    while (i <= N && j <= M)
    {
        ///caut o linie cu a[k][j] diferit de 0
        for (k = i;k <= N;++k)
            if (a[k][j] < -EPS || a[k][j] > EPS)
                break;
        if (k == N + 1) ///n am gasit niciuna, trec la coloana urmatoare
        {
            ++j;
            continue;
        }
        if (k != i) ///am gasit una, yay
            for (int p = j;p <= M + 1;++p)
                swap(a[i][p], a[k][p]);
        ///impart toata linia la a[i][j] pentru a usura calculele, a[i][j] devine 1
        for (int p = j + 1;p <= M + 1;++p)
            a[i][p] = a[i][p] / a[i][j];
        a[i][j] = 1;
        ///scad din restul liniilor, prima linie inmultita cu o constanta, pentru a obinte 0 pe coloana j
        for (int p = i + 1;p <= N;++p)
        {
            for (int q = j + 1;q <= M + 1;++q)
                a[p][q] -= a[p][j] * a[i][q];
            a[p][j] = 0;
        }
        ++i;
        ++j;
    }
    for (int i = N;i >= 1;--i)
        for (int j = 1;j <= M + 1;++j)
            if (a[i][j] < -EPS || a[i][j] > EPS)
            {
                if (j == M + 1) ///nu avem solutie
                {
                    fout << "Imposibil\n";
                    return 0;
                }
                sol[j] = a[i][M + 1];
                for (int p = j + 1;p <= M;++p)
                    sol[j] -= sol[p] * a[i][p];
                break;
            }
    fout << setprecision(8) << fixed;
    for (int i = 1;i <= M;++i)
        fout << sol[i] << " ";
    fout << "\n";
    fin.close();
    fout.close();
    return 0;
}