Cod sursa(job #1545488)

Utilizator sebinechitasebi nechita sebinechita Data 6 decembrie 2015 19:46:13
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.2 kb
#include <iostream>
#include <fstream>
#include <iomanip>
#include <cmath>
using namespace std;
ifstream fin("gauss.in");
ofstream fout("gauss.out");
#define eps 1e-4
#define MAX 302

double a[MAX][MAX], rez[MAX];
int n, m;

void af()
{
    int i, j;
    for(i = 1 ; i <= n ; i++)
    {
        for(j = 1 ; j <= m + 1 ; j++)
        {
            cout << a[i][j] << " ";
        }
        cout << "\n";
    }
    cout << '\n';
}

int main()
{
    int i, j, ci, cj;
    fin >> n >> m;
    for(i = 1 ; i <= n ; i++)
    {
        for(j = 1 ; j <= m + 1 ; j++)
        {
            fin >> a[i][j];
        }
    }
    i = j = 1;
    while(i <= n && j <= m)
    {
        for(ci = i ; ci <= n ; ci++)
        {
            if(abs(a[ci][j]) >= eps)
            {
                for(cj = j ; cj <= m + 1 ; cj++)
                {
                    swap(a[i][cj], a[ci][cj]);
                }
                break;
            }
        }
        if(ci == n + 1)
        {
            j++;
            continue;
        }
        //af();
        for(cj = m + 1 ; cj >= j ; cj--)
        {
            a[i][cj] /= a[i][j];
        }
       // af();
        for(ci = i + 1 ; ci <= n ; ci++)
        {
            if(abs(a[ci][j]) >= eps)
            {
                for(cj = m + 1 ; cj >= j ; cj--)
                {
                    a[ci][cj] -= a[ci][j] * a[i][cj];
                }
            }
        }
       // af();
     //   cout << "---------------------\n\n";
        i++;
        j++;
    }
//    af();
    for(i = n ; i >= 1 ; i--)
    {
        for(j = 1 ; j <= m + 1 ; j++)
        {
            if(abs(a[i][j]) >= eps)
            {
                if(j == m + 1)
                {
                    fout << "Imposibil\n";
                    return 0;
                }
                rez[j] = a[i][m + 1];

                for(cj = j + 1 ; cj <= m ; cj++)
                {
                    rez[j] -= rez[cj] * a[i][cj];
                }
                break;
            }
        }
    }
    for(i = 1 ; i <= m ; i++)
    {
        fout << fixed << setprecision(8) << rez[i] << " ";
    }
    fout << "\n";

}