Cod sursa(job #831975)

Utilizator dicu_dariaDaria Dicu dicu_daria Data 9 decembrie 2012 16:34:27
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <fstream>
#include <algorithm>
#include <iomanip>
#define eps 0.000001

using namespace std;
int i, j, p, l, c, n, m;
double a[350][350], x[350];
int main()
{
    ifstream fi("gauss.in");
    ofstream fo("gauss.out");
    fi >> n >> m;
    for(i = 1; i <= n; i++)
        for(j = 1; j <= m+1; j++)
            fi >> a[i][j];
    i = 1; j = 1;
    while(i <= n and j <= m)
    {
        for(p = i; p <= n; p++)
            if(a[p][j] < -eps or a[p][j] > eps)
                break;
        if(p == n+1)
        {
            j++;
            continue;
        }
        if(i != p)
            for(l = 1; l <= m+1; l++) swap(a[p][l], a[i][l]);
        for(l = j+1; l <= m+1; l++)
            a[i][l] = (double)a[i][l] / a[i][j];
        a[i][j] = 1;
        for(l = i+1; l <= n; l++)
        {
            for(c = j+1; c <= m+1; c++)
                a[l][c] -= (double)a[i][c]*a[l][j];
            a[l][j] = 0;
        }
        i++; j++;
    }
    for(i = n; i > 0; i--)
        for(j = 1; j <= m+1; j++)
        if(a[i][j] < -eps or a[i][j] > eps)
        {
            if(j == m+1)
            {
                fo << "Imposibil\n";
                return 0;
            }
            x[j] = a[i][m+1];
            for(p = j+1; p <= m; p++) x[j] -= (double)x[p]*a[i][p];

            break;
        }
    fo << setprecision(9) << fixed;
    for(i = 1; i <= m; i++) fo << x[i] << " ";
    fo << "\n";
    return 0;
}