Cod sursa(job #3042042)

Utilizator LuciBBadea Lucian LuciB Data 3 aprilie 2023 20:07:44
Problema Algoritmul lui Gauss Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.87 kb
#include <bits/stdc++.h>
using namespace std;

const int NMAX = 300;
const double EPS = 1e-10;

double a[NMAX][NMAX + 1];
double ans[NMAX];

int main() {
    FILE *fin, *fout;
    fin = fopen("gauss.in", "r");
    fout = fopen("gauss.out", "w");
    int n, m;
    fscanf(fin, "%d%d", &n, &m);
    for(int i = 0; i < n; i++)
        for(int j = 0; j < m + 1; j++)
            fscanf(fin, "%lf", &a[i][j]);
    int lin, col;
    lin = col = 0;
    while(lin < n && col < m) {
        int lin2 = -1;
        for(int i = lin; i < n; i++) {
            if(lin2 == -1 && (a[i][col] > -EPS || a[i][col] < EPS))
                lin2 = i;
        }
        if(lin2 == -1)
            col++;
        else {
            if(lin2 != lin) {
                for(int j = 0; j < m + 1; j++)
                    swap(a[lin][j], a[lin2][j]);
            }
            for(int j = col + 1; j < m + 1; j++)
                a[lin][j] = a[lin][j] / a[lin][col];
            a[lin][col] = 1;
            for(int i = lin + 1; i < n; i++) {
                for(int j = col + 1; j < m + 1; j++)
                    a[i][j] -= a[i][col] * a[lin][j];
                a[i][col] = 0;
            }
            lin++;
            col++;
        }
    }
    bool stg = true;
    for(int i = n - 1; i >= 0 && stg; i--) {
        int col2 = -1;
        for(int j = 0; j < m + 1 && stg; j++) {
            if(col2 == -1 && (a[i][j] > -EPS || a[i][j] < EPS)) {
                col2 = j;
            }
        }
        if(col2 == m)
            stg = false;
        if(stg) {
            ans[col2] = a[i][m];
            for(int col = col2 + 1; col < m + 1; col++) {
                ans[col2] -= ans[col] * a[i][col];
            }
        }
    }
    if(stg == false)
        fprintf(fout, "Imposibil");
    else {
        for(int i = 0; i < m; i++)
            fprintf(fout, "%.10lf ", ans[i]);
    }
    fclose(fin);
    fclose(fout);
    return 0;
}