#include <iostream.h>

double **gauss(double** mp, int rows, int cols) {
    int i, j, k, inv=1;
    double x, *t;
    for (i=0; i<rows; i++) {
        if (mp[i][i]==0) {
            k=i+1;
            while ((k<rows)&&(!mp[k][i])) k++;
            if ((k==rows)&&(inv==-1)) for (i=0; i<rows; i++) for (j=0; j<cols; j++) mp[i][j]*=inv;
            if (k==rows) return mp;
            t=mp[i]; mp[i]=mp[k]; mp[k]=t;
            inv*=-1;
        };
        for (j=i+1; j<rows; j++) {
            x=mp[j][i]/mp[i][i];
            for (k=i; k<cols; k++)
                mp[j][k]-=x*mp[i][k];
        }
    }
    if (inv!=1) for (i=0; i<rows; i++) for (j=0; j<cols; j++) mp[i][j]*=inv;
    return mp;
}

int main() {
    double**mp;
    int rows, cols, i, j;
    cout << "Enter number of rows, cols: ";
    cin >> rows >> cols;
    mp=new double* [rows];
    for (i=0;i<rows; i++) mp[i]=new double [cols];
    for (i=0; i<rows; i++) {
        for (j=0; j<cols; j++) {
            cout << "Enter " << i << "," << j<<"'th entry: ";
            cin >> mp[i][j];
        }
    }
    for (i=0; i<rows; i++) {
        for (j=0; j<cols; j++)
            cout << mp[i][j] << '\t';
        cout << endl;
    };
    gauss(mp, rows, cols);

    for (i=0; i<rows; i++) {
        for (j=0; j<cols; j++)
            cout << mp[i][j] << '\t';
        cout << endl;
    };
    cin >> i;
};

