Cod sursa(job #2743121)

Utilizator raduk11Serban Mihai-Radu raduk11 Data 22 aprilie 2021 16:27:12
Problema Algoritmul lui Gauss Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.86 kb
#include <iostream>
#include <fstream>
#include <cmath>

using namespace std;

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

const double eps = 1e-10;
const int maxn = 300;

int n, m;
double A[maxn + 1][maxn + 2],
       x[maxn + 1];

void afisare()
{
    out.setf(ios::fixed, ios::floatfield);
    out.precision(10);
    for(int i = 1; i <= m; i++)
        out << x[i] << ' ';
}
void gauss()
{
    int i = 1, j = 1, k, p;
    while(i <= n && j <= m)
    {
        if(abs(A[i][j]) <= eps)
        {
            bool ok = 0;
            for(k = i + 1; k <= n; k++)
                if(abs(A[k][j] > eps))
                {
                    ok = 1;
                    for(p = j; j <= m + 1; ++p)
                        swap(A[i][p], A[k][p]);
                    break;
                }
            if(!ok)
            {
                j++;
                continue;
            }
        }
        for(k = j + 1; k <= m + 1; k++)
            A[i][k] /= A[i][j];
        A[i][j] = 1.0;
        for(k = i + 1; k <= n; k++)
        {
            for(p = j + 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)
            {
                if(j == m + 1)
                    return 0;
                x[j] = A[i][m + 1];
                for(int k = j + 1; k <= m; k++)
                    x[j] -= x[k] * A[i][k];
                break;
            }
    return 1;
}
int main()
{
    in >> n >> m;
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= m + 1; j++)
            in >> A[i][j];
    gauss();
    if(solutie())
        afisare();
    else
        out << "Imposibil";
    return 0;
}