Cod sursa(job #1254055)

Utilizator Tester100Tester Tester100 Data 2 noiembrie 2014 10:01:01
Problema Algoritmul lui Gauss Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.96 kb
#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <algorithm>
#include <cmath>
using namespace std;
const double EPS = 1e-9;
int n, m;
double a[304][304], x[304];
inline bool equal(const double x,const double y){
    if(fabs(x-y)<EPS)
        return 1;
    return 0;
}

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

inline void Write(){
    for(int i=1;i<=n;++i){
        for(int j=1;j<=m+1;++j)
            cout<<a[i][j]<<" ";
        printf("\n");
    }
    printf("\n");
}

int main(){
    freopen("gauss.in","r",stdin);
    freopen("gauss.out","w",stdout);
    scanf("%i %i\n",&n,&m);
    for(int i=1;i<=n;++i)
        for(int j=1;j<=m+1;++j)
            scanf("%lf",&a[i][j]);
    int i = 1,j = 1;
    for( ;i <= n && j <= m;){
        int ind = i;
        for(;ind <= n;++ind)
            if(!equal(a[ind][j],0))
                break;
        if(ind == n+1){
            ++j;
            continue;
        }
        if(ind != i)
            Swap(i,ind);
        for(int p = j+1;p <= m+1;++p)
            a[i][p] /= a[i][j];
        a[i][j] = 1;
        for(int k=i+1;k<=n;++k){
            for(int p=j+1;p<=m+1;++p)
                a[k][p] -= a[k][j]*a[i][p];
            a[k][j] = 0;
        }
        ++i,++j;
    }
    for(int i=1;i<=n;++i){
        for(int j=1;j<=m+1;++j)
            printf("%lf ",a[i][j]);
        printf("\n");
    }
    for(int i = n; i>0; --i)
        for(int j = 1; j <= m+1; ++j)
            if(!equal(a[i][j],0))
            {
                if(j == m+1)
                {
                    printf("Imposibil\n");
                    return 0;
                }
                x[j] = a[i][m+1];
                for(int k = j+1; k <= m; ++k)
                    x[j] -= x[k] * a[i][k];
                break;
            }
    for(int i=1;i<=m;++i)
        printf("%.7lf ",x[i]);
    printf("\n");
    return 0;
}