Cod sursa(job #2918769)

Utilizator alexdumitruAlexandru Dumitru alexdumitru Data 12 august 2022 22:21:21
Problema Algoritmul lui Gauss Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.42 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("gauss.in");
ofstream fout("gauss.out");

const double eps=1e-8;

double mat[305][305],sol[305];

int n,m,i,j,k;

void myswap(double a, double b)
{
    double c=a;
    a=b;
    b=c;
}

void swaplines(int l1, int l2)
{
    for(int i=1;i<=m+1;i++)
        myswap(mat[l1][i],mat[l2][i]);
}

void gauss()
{
    i=1;j=1;
    while(i<=n&&j<=m)
    {
        for(k=i;k<=n;k++)
            if(mat[k][j]<-eps||mat[k][j]>eps)
                break;
        if(k==n+1){j++;continue;}
        if(k!=i)swaplines(i,k);
        for(k=m+1;k>=j;k--)
            mat[i][k]/=mat[i][j];
        for(k=i+1;k<=n;k++)
            for(int l=m+1;l>=j;l--)
                mat[k][l]-=mat[k][j]*mat[i][l];
        i++;j++;
    }
    for(i=n;i>=1;i--)
        for(j=1;j<=m+1;j++)
            if(mat[i][j]<-eps||mat[i][j]>eps)
            {
                if(j==m+1)
                {
                    fout<<"Imposibil\n";
                    exit(0);
                }
                sol[j]=mat[i][m+1];
                for(k=j+1;k<=m;k++)
                    sol[j]-=sol[k]*mat[i][k];
                break;
            }
}

signed main()
{
    fin>>n>>m;
    for(i=1;i<=n;i++)
        for(j=1;j<=m+1;j++)
            fin>>mat[i][j];
    gauss();
    fout<<fixed<<setprecision(8);
    for(i=1;i<=m;i++)
        fout<<sol[i]<<' ';
    return 0;
}