Cod sursa(job #1468621)

Utilizator bogdan10bosBogdan Sitaru bogdan10bos Data 6 august 2015 15:43:00
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.93 kb
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <deque>

#define INF ( (1 << 30) - 1 + (1 << 30) )
#define mod 666013
#define eps 0.0000000001

using namespace std;
int n, m, i, j, ii, x;
double r;
double v[405], a[405][405];

void schimba(int i1, int i2)
{
    for(int j = 1; j <= m + 1; j++)
        swap(a[i1][j], a[i2][j]);
}

void imparte(int x, int y)
{
    double el = a[x][y];
    for(int j = 1; j <= m + 1; j++)
        a[x][j] /= el;
}

void scade(int i1, int i2, double inml)
{
    for(int j = 1; j <= m + 1; j++)
        a[i1][j] -= a[i2][j] * inml;
}

int main()
{
    freopen("gauss.in", "r", stdin);
    freopen("gauss.out", "w", stdout);
    scanf("%d%d", &n, &m);
    for(i = 1; i <= n; i++)
        for(j = 1; j <= m + 1; j++)
        {
            scanf("%d", &x);
            a[i][j] = (double)x;
        }

    for(i = 1, j = 1; i <= n && j <= m; i++, j++)
    {
        for(ii = i; ii <= n; ii++)
            if( fabs(a[ii][j]) > eps )
                break;

        if(ii > n)
        {
            i--;
            continue;
        }

        if(i != ii)
            schimba(i, ii);
        imparte(i, j);
        for(ii = i + 1; ii <= n; ii++)
            if( fabs(a[ii][j]) > eps )
                scade(ii, i, a[ii][j]);
    }

    for(i = n; i >= 1; i--)
        for(j = 1; j <= m + 1; j++)
            if( fabs(a[i][j]) > eps)
            {
                if(j == m + 1)
                {
                    printf("Imposibil\n");
                    return 0;
                }

                r = a[i][m + 1];
                for(ii = j + 1; ii <= m; ii++)
                    r -= a[i][ii] * v[ii];

                v[j] = r;
                break;
            }

    for(i = 1; i <= m; i++)
        printf("%.8lf ", v[i]);
    return 0;
}