Cod sursa(job #2263685)

Utilizator SqueekDanielTodasca Daniel SqueekDaniel Data 19 octombrie 2018 00:40:51
Problema Algoritmul lui Gauss Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.82 kb
#include <bits/stdc++.h>

#define MaxN 305
#define EPS  (1e-8)

std::ifstream InFile("gauss.in");
std::ofstream OutFile("gauss.out");

int N, M;
double Sol[MaxN], A[MaxN][MaxN];
double Val;

void Citire() {
    InFile >> N >> M;
    for (int i = 0; i < N; i++)
        for (int j = 0; j <= M; j++)
            InFile >> A[i][j];
}

void Rezolvare() {
    bool Check;
    int LC = 0, CC = 0;
    while (LC < N && CC < M) {
        if (abs(A[LC][CC]) < EPS) {
            Check = 0;

            for (int i=LC + 1; i<N; i++)
                if (abs(A[i][CC]) >= EPS) {
                    for (int j = CC; j <= M; j++)
                        std::swap(A[i][j], A[LC][j]);
                    Check = 1;
                    break;
                }
            if (Check == 0) {
                CC++;
                continue;
            }
        }

        for (int i = CC + 1; i <= M; i++)
            A[LC][i] /= A[LC][CC];
        A[LC][CC] = 1;

        for (int i = LC + 1, j; i < N; i++) {
            for (j = CC + 1; j <= M; j++)
                A[i][j] -= A[i][CC] * A[LC][j];
            A[i][CC] = 0;
        }   LC++;   CC++;
    }

    Check = 1;
    for(int i = N - 1, j; i >= 0; i--) {
        for (j=0; j<=M && abs(A[i][j]) < EPS; ++j);

        if(j==M + 1)
            continue;
        else if(j == M) {
            Check = 0;
            break;
        }
        else {
            Val = 0;
            for (int k = j + 1; k < M; k++)
                Val += A[i][k] * Sol[k];
            Sol[j] = A[i][M] - Val;
        }
    }   OutFile << std::fixed << std::setprecision(10);

    if(Check == 0) OutFile << "Imposibil\n";
    else for(int i = 0; i < M; i++)
        OutFile << Sol[i] << ' ';
}

int main()
{
    Citire();
    Rezolvare();

    return 0;
}