Cod sursa(job #1400011)

Utilizator badea_adi1999Badea Adrian Catalin badea_adi1999 Data 25 martie 2015 01:18:30
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.83 kb
#include <fstream>
#include <iomanip>
#define eps 0.000000001
#define nmax 310
using namespace std;
ifstream f("gauss.in");
ofstream g("gauss.out");
int n,m;
double v[nmax][nmax];
double aux,sol[nmax];


int main()
{
    int i,j,k,t;
    f>>n>>m;
    for (i=1;i<=n;i++)
        for (j=1;j<=m+1;j++)
            f>>v[i][j];
    i=1;j=1;
    //Sunt la ecuatia i , necunoscuta j
    while (i<=n&&j<=m) {
        for (k=i;k<=n;k++)
            if (v[k][j])
                break;
        //Caut prima linie care are necunoscuta j diferita de 0
        if (k==n+1) {
            j++;
            continue;
        }
        //Interschimb ecuatiile
        if (k!=i) {
            for (t=1;t<=m+1;t++) {
                aux=v[i][k];
                v[i][k]=v[k][k];
                v[k][k]=aux;
            }
        }
        //Impart ecuatia astfel incat coeficientul lui j sa fie 1
        for (t=j+1;t<=m+1;t++)
            v[i][t]/=v[i][j];
        v[i][j]=1;
        //Scad ecuatia din toate celelalte
        for (k=i+1;k<=n;k++) {
            for (t=j+1;t<=m+1;t++)
                v[k][t]-=v[i][t]*v[k][j];
            v[k][j]=0;
        }
        i++;j++;
    }
    for (i=n;i>=1;i--) {
        //Gasesc primul necunoscut deja determinat
        for (j=1;j<=m+1;j++)
            if (v[i][j]<-eps||v[i][j]>eps)
                break;
        //Daca totul e 0 continui
        if (j==m+2) {
            continue;
        }
        //Nu se poate ca suma cu coeficienti nuli sa fie nula
        if (j==m+1) {
            g<<"Imposibil\n";
            return 0;
        }
        //Gasim toate necunoscutele
        sol[j]=v[i][m+1];
        for (k=j+1;k<=m;k++)
            sol[j]-=sol[k]*v[i][k];
    }
    for (i=1;i<=m;i++)
        g<<setprecision(10)<<fixed<<sol[i]<<' ';


    return 0;
}