Cod sursa(job #815472)

Utilizator Buzu_Tudor_RoCont vechi Buzu_Tudor_Ro Data 17 noiembrie 2012 00:24:02
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include<fstream>
#include<algorithm>
#include<iomanip>
using namespace std;
const double eps=0.00001;
int n,m;
bool imposibil;
double a[302][302],x[302];

int main(){
    ifstream fin("gauss.in");
    ofstream fout("gauss.out");
    fin>>n>>m;
    for (int i=1;i<=n;i++)
        for (int j=1;j<=m+1;j++) fin>>a[i][j];
        
    int j=1;
    for (int i=1;i<=n &&j<=m;i++,j++) 
    {
       int k;
       for (k=i;k<=n;k++)
            if (a[k][j]<-eps || a[k][j]>eps) break;
      
       if (k==n+1) {j++; continue;}
       
       for (int l=1;l<=m+1;l++) swap(a[i][l],a[k][l]);
       for (int l=j+1;l<=m+1;l++) a[i][l]/=a[i][j];
       a[i][j]=1;
       
       for (int l=i+1;l<=n;l++)
        {
           for (int q=j+1;q<=m+1;q++) a[l][q]-=a[i][q]*a[l][j];
           a[l][j]=0;
        }
    }
    
    for (int i=n;i>=1;i--)
        for (int j=1;j<=m+1;j++)
             if (a[i][j]<-eps || a[i][j]>eps)
             {
                  if (j==m+1) {imposibil=true; break; }
                  x[j]=a[i][m+1];
                  for (int k=i-1;k>=1;k--)
                    {
                        a[k][m+1]-=x[j]*a[k][j];
                        a[k][j]=0;   
                    } 
                  break;
             }
    
    if (imposibil) fout<<"Imposibil";
    else for (int i=1;i<=m;i++) fout<<fixed<<setprecision(8)<<x[i]<<" ";
    fout<<'\n'; fin.close(); fout.close();
}