Cod sursa(job #2487284)

Utilizator denmirceaBrasoveanu Mircea denmircea Data 4 noiembrie 2019 14:50:43
Problema Algoritmul lui Gauss Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.59 kb
#include <bits/stdc++.h>
#define dim 310
#define err 0.000000001
using namespace std;
ifstream fin("gauss.in");
ofstream fout("gauss.out");
double a[dim][dim];
double X[dim];
int n,m,i,j,t,k,sol;
int main()
{
    fin>>n>>m;
    for(i=1;i<=n;i++)
        for(j=1;j<=m+1;j++)
        fin>>a[i][j];
    i=1;j=1;
    while(i<=n&&j<=m){
        /// gasesc prima coloana diferita de 0
        for(k=i;k<=n;k++)
            if(a[k][j]!=0)
                break;
        if(k==n+1){
            //// toate 0
            j++;
            continue;
        }
        if(k!=i){
            //// fac swap linii pentru ca linia curenta are 0 la x
            swap(a[i],a[k]);
        }
        /// impart prin a[i][j] toata ecuatia
        for(t=j+1;t<=m+1;t++){
            a[i][t]/=a[i][j];
        }
        a[i][j]=1;
        for(k=i+1;k<=n;k++){
            for(t=j+1;t<=m+1;t++){
                    /// inmultesc linia cu -x si adun liniile
                a[k][t] += (-a[k][j])*a[i][t];
            }
            a[k][j]=0; /// 0 sub diagonala principala
        }
        i++;
        j++;
    }
    for(i=n;i>=1;i--){
        for(j=1;j<=m+1;j++)
            if(a[i][j]<-err||a[i][j]>err)
                break;
        if(j==m+2){
            continue;
        }
        if(j==m+1){
            sol=-1;
            break;
        }
        X[j]=a[i][m+1];
        for(t=j+1;t<=m;t++)
            X[j]-=a[i][t]*X[t];
    }
    if(sol==-1){
        fout<<"Imposibil";
        return 0;
    }
    for(i=1;i<=m;i++)
        fout<<fixed<<setprecision(10)<<X[i]<<" ";
}