Cod sursa(job #1757295)

Utilizator ArambasaVlad Arambasa Arambasa Data 14 septembrie 2016 20:08:13
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.69 kb
#include<fstream>
#include<iomanip>
#define eps 0.0000000001
using namespace std;
ifstream in("gauss.in");
ofstream out("gauss.out");
double a[305][305],ans[305];
int n,m,ind,i,j,idx,k;
bool ok;
int imp=1;
void Read()
{
    in>>n>>m;
    for(i=1;i<=n;i++)
        for(j=1;j<=m+1;j++)
          in>>a[i][j];
}
void Solve()
{
    i=1;j=1;
    while(i<=n&&j<=m)
    {
        k=i;
        while(a[k][j]<eps&&a[k][j]>-eps&&k<=n)
            k++;
        if(k==n+1)
        {
            j++;
            continue;
        }
        if(k!=i)
        {
            for(ind=j;ind<=m+1;ind++)
                swap(a[i][ind],a[k][ind]);
        }
        for(ind=j+1;ind<=m+1;ind++)
            a[i][ind]/=a[i][j];
        a[i][j]=1;
        for(idx=i+1;idx<=n;idx++)
        {
            for(ind=j+1;ind<=m+1;ind++)
            {
                a[idx][ind]-=a[idx][j]*a[i][ind];
            }
            a[idx][j]=0;
        }
        i++,j++;
    }

    k=m;
    for(i=n;i>=1;i--)
    {
        ok=0;
        for(j=1;j<=m+1&&ok==0;j++)
        {
            if(a[i][j]<-eps||a[i][j]>eps)
            {
                if(j==m+1)
                {
                    out<<"Imposibil";
                    imp=0;
                    return ;
                }
                ans[j]=a[i][m+1];
                for(ind=m;ind>=j+1;ind--)
                {
                    ans[j]-=ans[ind]*a[i][ind];
                }
                ok=1;
            }
        }
    }
}
void Print()
{
    if (imp==1)
      for(i=1;i<=m;i++)
        out<<fixed<<setprecision(10)<<ans[i]<<' ';
}
int main()
{
    Read();
    Solve();
    Print();
    return 0;
}