Cod sursa(job #1213983)

Utilizator mariusn01Marius Nicoli mariusn01 Data 29 iulie 2014 13:10:16
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
#include <fstream>
#include <iomanip>
#define DIM 310
#define EPS 0.000000001
using namespace std;
ifstream fin("gauss.in");
ofstream fout("gauss.out");

double A[DIM][DIM];
double X[DIM], aux;

int n, i, j, m, k, t, sol;

int main() {
    fin>>n>>m;
    for (i=1;i<=n;i++)
        for (j=1;j<=m+1;j++)
            fin>>A[i][j];

    i = 1; j = 1;// i = ecuatia la care sunt, j = necunoscuta
    while (i<=n && j<=m) {
        for (k=i;k<=n;k++)
            if (A[k][j] != 0)
                break;
        if (k == n+1) {
            j++;
            continue;
        }
        if (k!=i) {
            for (t=1;t<=m+1;t++) {
                aux = A[i][t];
                A[i][t] = A[k][t];
                A[k][t] = aux;
            }
        }
        // A[i][j] e sifur nenul
        for (t = j+1;t<=m+1;t++)
            A[i][t]/=A[i][j];
        A[i][j] = 1;

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

    for (i=n;i>=1;i--) {
        // caut prima pozitie nenula de pe linia i
        for (j=1;j<=m+1;j++)
            if (A[i][j] < -EPS || A[i][j] > EPS)
                break;
        if (j == m+2)
            continue;
        if (j == m+1) {
            sol = -1;
            break;
        }
        X[j] = A[i][m+1];
        for (k=j+1;k<=m;k++)
            X[j] -= X[k] * A[i][k];
    }

    if (sol == -1) {
        fout<<"Imposibil\n";
    } else {
        for (i=1;i<=m;i++)
            fout<<setprecision(10)<<fixed<<X[i]<<" ";
    }

    return 0;
}