Cod sursa(job #2334447)

Utilizator refugiatBoni Daniel Stefan refugiat Data 2 februarie 2019 17:08:56
Problema Algoritmul lui Gauss Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.3 kb
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
FILE* si=fopen("gauss.in", "r");
FILE* so=fopen("gauss.out", "w");
const double nul=0.00000000001;
double v[305][305];
double sol[305];
int main() {
    int n,m;
    fscanf(si, "%i %i", &n, &m);
    m++;
    for(int i=1; i<=n; ++i)
        for(int j=1; j<=m; ++j)
            fscanf(si, "%lf", &v[i][j]);
    int k,l;
    for(int i=1, j=1; i<=n&&j<m; ++j) {
        for(k=i; k<=n&&!(v[k][j]>nul||v[k][j]<-nul); ++k);
        if(k==n+1)
            continue;
        swap(v[i],v[k]);
        for(l=j+1; l<=m; ++l)
            v[i][l]=v[i][l]/v[i][j];
        v[i][j]=1;
        for(k=i+1; k<=n; ++k) {
            for(l=j+1; l<=m; ++l)
                v[k][l]=v[k][l]-v[i][l]*v[k][j];
            v[k][j]=0;
        }
        ++i;
    }
    bool bun=true;

    for(int i=n; i&&bun; --i) {
        for(k=1; k<=m&&!(v[i][k]>nul||v[i][k]<-nul); ++k);
        if(k==m) {
            bun=false;
            break;
        }
        sol[k]=v[i][m];
        for(int j=k+1; j<m; ++j) {
            sol[k]-=sol[j]*v[i][j];
        }
    }
    if(bun) {
        for(int i=1;i<m;++i) {
            fprintf(so, "%.10f ", sol[i]);
        }
    }
    else {
        fprintf(so, "Imposibil");
    }
    return 0;
}