Cod sursa(job #2073458)

Utilizator nurof3nCioc Alex-Andrei nurof3n Data 23 noiembrie 2017 10:44:03
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.75 kb
#include <fstream>
#include <cmath>
#include <iomanip>

using namespace std;

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

const double eps = 1e-8;
int N, M;
double A[301][302], x[301];

void gauss()
{
    int i = 1, j = 1;
    while(i <= N && j <= M)
    {
        if(abs(A[i][j]) <= eps) //if(A[i][i] == 0)
        {
            bool praf = 0;
            for(int k = i + 1; k <= N; k++)
                if(abs(A[k][j]) > eps) //if(A[j][i] != 0)
                {
                    for(int l = j; l <= M + 1; l++)
                        swap(A[i][l], A[k][l]);
                    praf = 1;
                    break;
                }
            if(praf == 0)
            {
                j++;
                continue;
            }
        }
        for(int k = j + 1; k <= M + 1; k++)
            A[i][k] /= A[i][j];
        A[i][j] = 1;
        for(int l = i + 1; l <= N; l++)
        {
            for(int k = j + 1; k <= M + 1; k++)
                A[l][k] -= A[i][k] * A[l][j];
            A[l][j] = 0;
        }
        i++, j++;
    }
}
bool detsol()
{
    int j;
    for(int i = N; i >= 1; i--)
    {
        j = 1;
        while(j <= M + 1 && abs(A[i][j]) <= eps) j++;
        if(j == M + 1) return false;
        if(j == M + 2) continue;
        x[j] = A[i][M + 1];
        for(int k = j + 1; k <= M; k++)
            x[j] -= A[i][k] * x[k];
    }
    return true;
}

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(detsol())
    {
        g << fixed << setprecision(10);
        for(int i = 1; i <= M; i++)
            g << x[i] << ' ';
    }
    else g << "Imposibil";
    return 0;
}