Pagini recente » Cod sursa (job #2303024) | Cod sursa (job #2690633) | Cod sursa (job #3245637) | Cod sursa (job #209037) | Cod sursa (job #2553760)
#include <bits/stdc++.h>
using namespace std;
ifstream f("gauss.in");
ofstream g("gauss.out");
class matrice
{
public:
void citire()
{
f >> nr_ec >> nr_nec;
int aux=nr_nec+1;
for (int i=1; i<=nr_ec; ++i)
{
for (int j=1; j<=aux; ++j)
f >> mat[i][j], initial[i][j]=mat[i][j];
}
}
void impartire_linie(int linie, double val)
{
int aux=nr_nec+1;
for (int j=linie; j<=aux; ++j)
mat[linie][j]/=val;
}
void stergere_din_linie(int din, int pe, double inmultire)
{
int aux=nr_nec+1;
for (int j=1; j<=aux; ++j)
{
mat[din][j]-=mat[pe][j]*inmultire;
}
}
bool cautare_jos(int l, int c)
{
for (int i=l+1; i<=nr_ec; ++i)
{
if (mat[i][c]!=0)
{
swap(mat[l],mat[i]);
return 1;
}
}
return 0;
}
void solve()
{
for (int i=1; i<=nr_ec; ++i)
{
if (mat[i][i]==0)
{
if (cautare_jos(i,i)==0)
{
i++;
continue;
}
}
if (i<=nr_nec)
{
impartire_linie(i,mat[i][i]);
for (int j=i+1; j<=nr_ec; ++j)
{
stergere_din_linie(j,i,mat[j][i]/mat[i][i]);
}
}
}
}
bool verificare_linie(int ind)
{
int aux=nr_nec+1;
for (int i=1; i<=aux; ++i)
if (mat[i][aux])
return true;
return false;
}
bool verificare_total()
{
for (int i=1; i<=nr_ec; ++i)
{
double s=0;
for (int j=1; j<=nr_nec; ++j)
{
s+=initial[i][j]*rez[j];
}
if (s!=initial[i][nr_nec+1])
return 0;
}
return 1;
}
void afisare()
{
int aux=nr_nec+1;
for (int i=nr_ec; i>0; --i)
{
if (verificare_linie(i))
{
rez[i]=mat[i][aux]/mat[i][i];
for (int j=i-1; j>0; --j)
mat[j][aux]-=mat[j][i]*rez[i];
}
else
{
g << "Imposibil";
return;
}
}
if(!verificare_total())
{
g << "Imposibil\n";
return;
}
for (int i=1; i<=nr_nec; ++i)
g << setprecision(10)<<fixed<<rez[i] <<' ';
}
public:
int nr_ec, nr_nec;
double mat[305][305], rez[305], initial[305][305];
} ecuatie;
int nr_ec, nr_nec;
int main()
{
ecuatie.citire();
ecuatie.solve();
ecuatie.afisare();
return 0;
}