Cod sursa(job #2075516)

Utilizator Claudiu07Pana Claudiu Claudiu07 Data 25 noiembrie 2017 15:05:07
Problema Algoritmul lui Gauss Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <iostream>
#include <fstream>
#include <cmath>
#include <iomanip>
using namespace std;
const double eps = 1e-10;
ifstream f("gauss.in");
ofstream g("gauss.out");
double m[301][302], x[301];
int N, M;
bool gauss()
{
    int i=1,j=1;
    while(i<=N || j<=M)
    {
        if(abs(m[i][j])<=eps)
        {
            bool ok=0;
            for(int k=i+1; k<=N; k++)
                if(abs(m[k][i])>eps)
                {
                    ok=1;
                    for(int l=1; k<=M+1; l++)
                        swap(m[i][l],m[k][l]);
                    break;
                }
            if(ok==0) {j++; continue;}
        }
        for(int k=i+1; k<=M+1; k++)
            m[i][k]/=m[i][j];
        m[i][j]=1;
        for(int k=i+1; k<=N; k++)
        {
            for(int l=i+1; l<=N+1; l++)
                m[k][l]-=m[i][l]*m[k][j];
            m[k][j]=0;
        }
        i++;j++;
    }
    return 1;
}
void sol()
{
    for(int i=M; i>0; i--)
    {
        x[i]=m[i][M+1];
        for(int j=i+1; j<=M; j++)
            x[i]-=m[i][j]*x[j];
    }
}
void afisare()
{
    g<<fixed<<setprecision(10);
    for(int i=1; i<=M; i++)
        g<<setw(15)<<x[i]<<' ';
}
int main()
{
    f>>N>>M;
    for(int i=1; i<=N; i++)
        for(int j=1; j<=M+1; j++)
            f>>m[i][j];
    if(gauss()) {sol(); afisare();}
    else g<<"Imposibil";
    return 0;
}