Cod sursa(job #1467406)

Utilizator CollermanAndrei Amariei Collerman Data 3 august 2015 12:58:42
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include <fstream>
#include <iomanip>
using namespace std;
ofstream fout("gauss.out");
ifstream fin("gauss.in");

const int NMAX = 305;
const double EPS = 0.0000001;

int N, M, ok;
double S[NMAX][NMAX];
double Sol[NMAX];

int main()
{
    fin >> N >> M;
    for(int i=1; i<=N; i++)
        for(int j=1; j<=M+1; j++)
            fin >> S[i][j];

    int i = 1, j = 1, x = 0;

    while(i <= N && j <= M)
    {
        ok = 0;

        for(x=i; x<=N; x++)
            if(S[x][j] > EPS || S[x][j] < -EPS) {
                ok = 1;
                break;
            }

        if(!ok) { j++; continue; }

        if(x != i)
            for(int k=1; k<=M+1; k++)
                swap(S[x][k], S[i][k]);

        for(int k=j+1; k<=M+1; k++)
            S[i][k] /= S[i][j];
        S[i][j] = 1;

        for(int u=i+1; u<=N; u++) {
            for(int k=j+1; k<=M+1; k++)
                S[u][k] -= S[i][k] * S[u][j];
            S[u][j] = 0;
        }

        i++; j++;
    }

    for(int i=N; i; i--)
        for(int j=1; j<=M+1; j++)
            if(S[i][j] > EPS || S[i][j] < -EPS)
            {
                if(j == M+1) {
                    fout << "Imposibil\n";
                    return 0;
                }

                Sol[j] = S[i][M+1];
                for(int k=j+1; k<=M; k++)
                    Sol[j] -= Sol[k] * S[i][k];

                break;
            }

    for(int i=1; i<=M; i++)
        fout << fixed << setprecision(8) << Sol[i] << ' ';

    return 0;
}