Cod sursa(job #2728705)

Utilizator Arina2003Arina Aioanei Arina2003 Data 23 martie 2021 16:39:08
Problema Algoritmul lui Gauss Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.42 kb
#include <iostream>
#include <fstream>
#include <cmath>

using namespace std;

ifstream f("gauss.in");
ofstream g("gauss.out");

const double EPS = 1e-8;
const int MAXN = 301;

int n,m;
double A[MAXN][MAXN + 1], ///Matrice extinsa
       x[MAXN];           ///Vectorul solutie

void gauss()
{
    int i=1, j=1, k, p;
    while(i <= n && j <= m)
    {
        if(abs(A[i][j]) <= EPS)  //if(A[i][i] == 0)
        {
            ///cautam o linie k pt care a[k][j] != 0
            bool ok = 0;
            for(k = i+1; k<= n; k++)
                if(abs(A[k][j]) > EPS)    //if(A[k][j] != 0)
                {
                    ok = 1;
                    for(p = j; p <= m + 1; p++)
                        swap(A[i][p], A[k][p]);
                    break;
                }
            ///daca nu gasim ==> necunoscuta j este variabila libera
            ///incrementam pe j (trecem la coloana urmatoare)
            if(ok == 0) ///if(k == n + 1)
            {
                j++;
                continue;
            }
        }
        ///impartim toate valorile de pe linia i la A[i][j], A[i][j] devenind 1
        ///(valorile de pe linia i si coloanele 1...j-1 sunt deja 0
        for(p = i + 1; p <= m + 1; p++)
            A[i][p] /= A[i][j];
        A[i][j] = 1.0;
        ///scadem din ecuatiile i+1...N ecuatia i inmultita cu a[p][j]
        for(k = i + 1; k <= n; k++)
        {
            for(p = i + 1; p <= m + 1; p++)
                A[k][p] -= A[k][j] * A[i][p];
            A[k][j] = 0.0;
        }
        i++;
        j++;
    }
}

bool solutie()
{
    for(int i=n; i>=1; i--)
        for(int j = i; j <= m + 1; j++)
            if(abs(A[i][j]) > EPS)  ///A[i][j] != 0
            {
                if(j == m + 1)
                    return 0;        ///sistemul e incompatibil
                x[j] = A[i][m+1];    ///calculam necunscuta j
                for(int k = j + 1; k <= m; k++)
                    x[j] -= A[i][k] * x[k];
                break;
            }
    return 1;
}

void afisare()
{
    g.setf(ios::fixed,ios::floatfield);
    g.precision(10);
    for(int i=1; i <= m; i++)
        g << x[i] << ' ';
}

int main()
{
    f>>n>>m;
    for(int i=1; i <= n; i++)
        for(int j=1; j <= m+1; j++)
            f>>A[i][j];
    //
    gauss();
    //
    if(solutie())
        afisare();
    else
        g << "Imposibil";
    return 0;
}