Cod sursa(job #2828805)

Utilizator pielevladutPiele Vladut Stefan pielevladut Data 7 ianuarie 2022 23:57:17
Problema Algoritmul lui Gauss Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.99 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("gauss.in");
ofstream fout("gauss.out");

const int NMAX = 300;

int N, M;
long double v[NMAX + 5][NMAX + 5];

void swap_linii(int a, int b)
{
    for(int i = 1; i <= M + 1; i ++)
    {
        /*
        int aux = v[a][i];
        v[a][i] = v[b][i];
        v[b][i] = aux;
        */
        swap(v[a][i], v[b][i]);
    }
}

void afiseaza()
{
    fout << '\n';
    for(int i = 1; i <= N; i ++)
    {
        for(int j = 1; j <= M + 1; j ++)
        {
            fout << v[i][j] << ' ';
        }
        fout << '\n';
    }
    fout << '\n';
}

signed main()
{
    fin >> N >> M;
    for(int i = 1; i <= N; i ++)
    {
        for(int j = 1; j <= M + 1; j ++)
        {
            fin >> v[i][j];
        }
    }
    for(int i = 1; i <= M; i ++)
    {
        if(v[i][i] == 0)
        {
            for(int j = i + 1; j <= N; j ++)
            {
                if(v[j][i] != 0)
                {
                    swap_linii(i, j);
                    break;
                }
            }
        }
        for(int j = i; j <= N; j ++)
        {
            if(v[j][1] == 0)
            {
                continue;
            }
            for(int q = 1; q <= M + 1; q ++)
            {
                v[j][q] /= v[j][1];
            }
        }
        for(int j = i + 1; j <= N; j ++)
        {
            if(v[j][1] == 0)
            {
                continue;
            }
            for(int q = 1; q <= M + 1; q ++)
            {
                v[j][q] -= v[i][q];
            }
        }
    }
    for(int i = M; i >= 1; i --)
    {
        v[i][M + 1] /= v[i][i];
        v[i][i] = 1;
        for(int j = i - 1; j >= 1; j --)
        {
            v[j][M + 1] -= v[j][i] * v[i][M + 1];
            v[j][i] = 0;
        }
    }
    for(int i = 1; i <= M; i ++)
    {
        fout << fixed << setprecision(10) << v[i][M + 1] << ' ';
    }
    return 0;
}