Cod sursa(job #2249658)

Utilizator AlexutAlex Calinescu Alexut Data 30 septembrie 2018 09:53:08
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <cstdio>
#include <fstream>
#include <cmath>
#include <iomanip>
#define Nmax 303
#define ld long double
#define eps 0.000000001
using namespace std;

ifstream f("gauss.in");
ofstream g("gauss.out");
int n,m,k;
double mat[Nmax][Nmax];
double ans[Nmax];

void change(int a,int b,int c){
    for (int i=c;i<=m+1;i++) swap(mat[a][i],mat[b][i]);
}

void divide(int a,ld b,int c){
    for (int i=c;i<=m+1;i++) mat[a][i] /= b;
}

void sub(int a,int b,ld c,int d){
    for (int i=d;i<=m+1;i++) mat[a][i] -= mat[b][i]*c;
}

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

    k = 1;
    for (int j=1;j<=m;j++){
        if (abs(mat[k][j])<eps)
        for (int i=k;i<=n;i++)
            if (abs(mat[i][j])>eps){
                change(i,k,j);
                break;
            }
        if (abs(mat[k][j])<eps) continue;
        divide(k,mat[k][j],j);
        for (int i=k+1;i<=n;i++) sub(i,k,mat[i][j],j);
        k++;
    }

    for (int i=n;i>=1;i--){
        int sav = -1;
        for (int j=1;j<=m;j++){
            if (abs(mat[i][j])>eps){
                sav = j;
                break;
            }
        }
        if (sav==-1 && abs(mat[i][m+1])>eps){
            g<<"Imposibil\n";
            return 0;
        }
        for (int j=sav+1;j<=m;j++) mat[i][m+1] -= ans[j] * mat[i][j];
        ans[sav] = mat[i][m+1];
    }

    for (int i=1;i<=m;i++) g<<fixed<<setprecision(10)<<ans[i]<<' ';

    return 0;
}