Cod sursa(job #1390969)

Utilizator mihail.jianuJianu Mihail mihail.jianu Data 17 martie 2015 15:12:00
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include<cstdio>
const int N=300;
const double eps=0.0001;
double a[N+1][N+1];
double res[N+1];
int n,m;
double abs(double x){
    if(x>0)
        return x;
    return-x;
}
bool zero(double x){
    return abs(x)<=eps;
}
void swp(double&x,double&y){
    double aux=x;
    x=y;
    y=aux;
}
int main(){
    freopen("gauss.in","r",stdin);
    freopen("gauss.out","w",stdout);
    scanf("%d%d",&n,&m);
    m++;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            scanf("%lf",&a[i][j]);
    int i=1,j=1;
    while(i<=n&&j<m){
        int k;
        for(k=i;k<=n;k++)
            if(!zero(a[k][j]))
                break;
        if(k==n+1){
            j++;
            break;
        }
        for(int l=1;l<=m;l++)
            swp(a[i][l],a[k][l]);
        for(int l=j+1;l<=m;l++)
            a[i][l]/=a[i][j];
        a[i][j]=1;
        for(int i1=i+1;i1<=n;i1++){
            for(int j1=j+1;j1<=m;j1++)
                a[i1][j1]-=a[i][j1]*a[i1][j];
            a[i1][j]=0;
        }
        i++;
        j++;
    }
    for(i=n;i>=1;i--)
        for(int j=1;j<=m;j++)
            if(!zero(a[i][j])){
                if(j==m){
                    printf("Imposibil");
                    return 0;
                }
                res[j]=a[i][m];
                for(int k=j+1;k<m;k++)
                    res[j]-=res[k]*a[i][k];
                break;
            }
    for(int i=1;i<m;i++)
        printf("%.8lf ",res[i]);
    return 0;
}