Cod sursa(job #788558)

Utilizator stefanzzzStefan Popa stefanzzz Data 15 septembrie 2012 13:10:20
Problema Algoritmul lui Gauss Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
#include <fstream>
#include <iomanip>
#define MAXN 305
#define EPS 0.0001
using namespace std;
ifstream f("gauss.in");
ofstream g("gauss.out");

int n,m,last;
double a[MAXN][MAXN],x,sol[MAXN],S,aux;
bool uz[MAXN],s;

double ABS(double p){
    return p>0?p:(-p);}

int main()
{
    int i,j,k,ii;
    f>>n>>m;
    for(i=1;i<=n;i++)
        for(j=1;j<=m+1;j++)
            f>>a[i][j];
    i=1;
    for(j=1;j<=m;j++){
        for(k=i;k<=n&&ABS(a[k][j])<EPS;k++);
        if(k<=n){
            for(ii=j;ii<=m+1;ii++){
                aux=a[k][ii];
                a[k][ii]=a[i][ii];
                a[i][ii]=aux;}
            for(ii=m+1;ii>=j;ii--)
                a[i][ii]/=a[i][j];
            for(++k;k<=n;k++)
                if(ABS(a[k][j])>EPS){
                    x=-a[k][j];
                    for(ii=j;ii<=m+1;ii++)
                        a[k][ii]+=x*a[i][ii];}
            i++;}
        else{
            uz[j]=1;
            sol[j]=0;}}
    for(j=i;j<=n;j++)
        if(ABS(a[j][m+1])>EPS){
            g<<"Imposibil\n";
            return 0;}
    i--;
    for(j=1;j<=m;j++){
        if(ABS(a[i][j])>EPS){
            uz[j]=1;
            last=j;
            sol[j]=0;}}
    sol[last]=(a[i][m+1]/a[i][last]);
    while(--i){
        S=0;
        last=0;
        for(j=1;j<=m;j++)
            if(ABS(a[i][j])>EPS){
                if(uz[j])
                    S+=a[i][j]*sol[j];
                else{
                    last=j;
                    uz[j]=1;}}
        sol[last]=a[i][m+1]-S;}
    g<<fixed<<setprecision(8);
    for(i=1;i<=m;i++)
        g<<sol[i]<<' ';
    f.close();
    g.close();
    return 0;
}