Pagini recente » Cod sursa (job #322073) | Cod sursa (job #2261918) | Cod sursa (job #1146504) | Cod sursa (job #1799453) | Cod sursa (job #995751)
Cod sursa(job #995751)
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
using namespace std;
const double EPS = 1e-10;
const int Nmax = 310;
int N, M;
double A[Nmax][Nmax], X[Nmax];
int main()
{
freopen("gauss.in", "r", stdin);
freopen("gauss.out", "w", stdout);
scanf("%i %i", &N, &M);
for(int i = 1; i <= N; ++ i)
for(int j = 1; j <= M + 1; ++ j)
scanf("%lf", &A[i][j]);
int Ec = 1, Nec = 1, L;
while(Ec <= N && Nec <= M)
{
for(L = Ec; L <= N; ++ L)
if(A[L][Nec] < -EPS || A[L][Nec] > EPS)
break;
if(L == N + 1)
{
Nec ++;
break;
}
if(L != Ec)
for(int NowNec = 1; NowNec <= M + 1; NowNec ++)
{
double Temp = A[Ec][NowNec];
A[Ec][NowNec] = A[L][NowNec];
A[L][NowNec] = Temp;
}
for(int NowNec = Nec + 1; NowNec <= M + 1; NowNec ++)
A[Ec][NowNec] /= A[Ec][Nec];
A[Ec][Nec] = 1;
for(int NowEc = Ec + 1; NowEc <= N; ++ NowEc)
{
for(int NowNec = Nec + 1; NowNec <= M + 1; ++ NowNec)
A[NowEc][NowNec] -= A[NowEc][Nec] * A[Ec][NowNec];
A[NowEc][Nec] = 0;
}
Ec ++;
Nec ++;
}
for(int Ec = N; Ec > 0; Ec --)
for(int Nec = 1; Nec <= M + 1; ++ Nec)
if(A[Ec][Nec] < -EPS || A[Ec][Nec] > EPS)
{
if(Nec == M + 1)
{
printf("Imposibil\n");
return 0;
}
X[Nec] = A[Ec][M + 1];
for(int NowNec = Nec + 1; NowNec <= M; ++ NowNec)
X[Nec] -= X[NowNec] * A[Ec][NowNec];
break;
}
for(int i = 1; i <= M; ++ i)
printf("%.10f ", X[i]);
return 0;
}