Cod sursa(job #1972531)

Utilizator mihai.alphamihai craciun mihai.alpha Data 23 aprilie 2017 12:25:48
Problema Algoritmul lui Gauss Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.69 kb
#include <bits/stdc++.h>

using namespace std;

FILE *fin = fopen("gauss.in", "r");
FILE *fout = fopen("gauss.out", "w");

const int maxn = 300;
const double eps = 1e-8;

int n, m;
double a[maxn + 1][maxn + 1];
double x[maxn + 1];

inline bool zero(double x)  {
    return fabs(x) < eps;
}

int main()  {
    fscanf(fin, "%d%d", &n, &m);
    for(int i = 1;i <= n;i++)
        for(int j = 1;j <= m + 1;j++)
            fscanf(fin, "%lf", &a[i][j]);
    int i = 1, j = 1;
    while(i <= n && j <= m)  {
        int k = i;
        while(k <= n && zero(a[i][j]) == 1)
            k++;
        if(k == n + 1)  {
            j++;
            continue;
        }
        if(k != i)  {
            for(int aa = 1;aa <= m + 1;aa++)  {
                swap(a[i][aa], a[k][aa]);
            }
        }
        for(int aa = j + 1;aa <= m + 1;aa++)//incep de la j + 1 deoarece celelalte sunt 0 => nu le mai impart la a[i][j] pentru a usura calculele
            a[i][aa] /= a[i][j];
        a[i][j] = 1.0;

        for(int aa = i + 1;aa <= n;aa++)  {
            for(int bb = j + 1;bb <= m + 1;bb++)
                a[aa][bb] -= a[aa][j] * a[i][bb];
            a[aa][j] = 0.0;
        }
        i++, j++;
    }
    for(int i = n;i > 0;i--)  {
        for(int j = 1;j <= m + 1;j++)  {
            if(!zero(a[i][j]))  {
                if(j == m + 1)  {
                    fputs("Imposibil", fout);
                    return 0;
                }
            x[j] = a[i][m + 1];
            for(int aa = j + 1;aa <= m;aa++)  {
                x[j] -= x[aa] * a[i][aa];
            }
            break;
        }
    }
    }
    for(int i = 1;i <= m;i++)
        fprintf(fout, "%lf ", x[i]);
    fclose(fin);
    fclose(fout);
    return 0;
}