Cod sursa(job #1689540)

Utilizator emanuel_rRamneantu Emanuel emanuel_r Data 14 aprilie 2016 12:38:33
Problema Algoritmul lui Gauss Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include<iostream>
#include<fstream>
#include<vector>
#include<cstdlib>
#include<queue>
#include<cmath>
#include<algorithm>
#include<iomanip>

using namespace std;

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

double A[305][305];
double Sol[305];
double const tol = 1e-10;
int n, m;

void Read()
{
    int i, j;

    f>>n>>m;
    for(i=1; i<=n; i++)
        for(j=1; j<=m+1; j++)
            f>>A[i][j];
}

void Solve()
{
    int i, j, k, l;
    double nr;
    i = 1; j = 1;

    while(i <= n && j <= m){

        for(k=i; k<=n; k++)
            if(abs(A[k][j]) > tol)
                break;

        if(k > n){
            j++;
            continue;
        }

        for(l=j; l<=m+1; l++)
            swap(A[k][l], A[i][l]);

        for(l=j+1; l<=m+1; l++)
            A[i][l] /= A[i][j];
        A[i][j] = 1;

        for(k=i+1; k<=n; k++){
            nr = A[k][j];
            for(l=j; l<=m+1; l++)
                A[k][l] -= nr * A[i][l];
        }

        i++; j++;
    }

    for(i=n; i>0; i--){
        for(j=1; j<=m+1 && abs(A[i][j]) < tol; j++);

        if(j == m+1 && A[i][j]){
            g<<"Imposibil\n";
            return;
        }

        Sol[j] = A[i][m+1];
        for(k=j+1; k<=m; k++)
            Sol[j] -= Sol[k] * A[i][k];
    }

    for(i=1; i<=n; i++)
        g<<fixed<<setprecision(8)<<Sol[i]<<" ";
    g<<"\n";
}

int main()
{
    Read();
    Solve();
    return 0;
}