Pagini recente » Cod sursa (job #1741765) | Cod sursa (job #2399371) | Cod sursa (job #2888858) | Cod sursa (job #811684) | Cod sursa (job #2482909)
#include <iomanip>
#include <algorithm>
#include <fstream>
using namespace std;
const int NMAX = 305;
const double EPS = 0.0000001;
int N, M;
double a[NMAX][NMAX], sol[NMAX];
int main()
{
ifstream fin("gauss.in");
ofstream fout("gauss.out");
fin >> N >> M;
for (int i = 1;i <= N;++i)
for (int j = 1;j <= M + 1;++j)
fin >> a[i][j];
int i = 1, j = 1, k;
while (i <= N && j <= M)
{
///caut o linie cu a[k][j] diferit de 0
for (k = i;k <= N;++k)
if (a[k][j] < -EPS || a[k][j] > EPS)
break;
if (k == N + 1) ///n am gasit niciuna, trec la coloana urmatoare
{
++j;
continue;
}
if (k != i) ///am gasit una, yay
for (int p = j;p <= M + 1;++p)
swap(a[i][p], a[k][p]);
///impart toata linia la a[i][j] pentru a usura calculele, a[i][j] devine 1
for (int p = j + 1;p <= M + 1;++p)
a[i][p] = a[i][p] / a[i][j];
a[i][j] = 1;
///scad din restul liniilor, prima linie inmultita cu o constanta, pentru a obinte 0 pe coloana j
for (int p = i + 1;p <= N;++p)
{
for (int q = j + 1;q <= M + 1;++q)
a[p][q] -= a[p][j] * a[i][q];
a[p][j] = 0;
}
++i;
++j;
}
for (int i = N;i >= 1;--i)
for (int j = 1;j <= M + 1;++j)
if (a[i][j] < -EPS || a[i][j] > EPS)
{
if (j == M + 1) ///nu avem solutie
{
fout << "Imposibil\n";
return 0;
}
sol[j] = a[i][M + 1];
for (int p = j + 1;p <= M;++p)
sol[j] -= sol[p] * a[i][p];
break;
}
fout << setprecision(8) << fixed;
for (int i = 1;i <= M;++i)
fout << sol[i] << " ";
fout << "\n";
fin.close();
fout.close();
return 0;
}