Pagini recente » Cod sursa (job #2320978) | Cod sursa (job #2297880) | Istoria paginii runda/simulareoji111/clasament | Cod sursa (job #167661) | Cod sursa (job #1162875)
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
const int NMax = 310, MMax = 310;
const double EPS = 1e-9;
int N, M;
double sol[NMax], coef[NMax][MMax];
void Read()
{
FILE *f = fopen("gauss.in", "r");
fscanf(f, "%d %d", &N, &M);
for (int i = 1; i <= N; ++ i)
for (int j = 1; j <= M + 1; ++ j)
{
double x;
fscanf(f, "%lf", &x);
coef[i][j] = x;
}
fclose(f);
}
void Solve()
{
int nr_ec, nr_nec;
nr_ec = 1, nr_nec = 1;
while (nr_ec <= N && nr_nec <= M)
{
int i, j;
if (fabs(coef[nr_ec][nr_nec]) < EPS) /// daca am coeficientu 0
{
for (i = nr_ec + 1; i <= N; ++ i) /// caut o ecuatie care nu are coeficientu 0
if (fabs(coef[i][nr_nec]) > EPS)
break;
if (i == N + 1) /// daca nu am gasit asa ecuatie atunci ++nr_nec, trec la urmatoarea coloana
{
++ nr_nec;
continue;
}
else
for (int k = 1; k <= M + 1; ++ k) /// daca am gasit le interschimb si continui algoritmu
swap(coef[i][k], coef[nr_ec][k]);
}
for(i = 1; i <= N; ++ i)
{
if (i == nr_ec)
continue;
/// cream raport = coeficientu de la ecuatia i (aia la care vreau sa fac zerouri) / coeficientu la ecualtia nr_ec (asta curenta)
/// apoi din ecuatia i scadem raport * ecuatia nr_ec si o sa facem 0 pe linia i coloana nr_nec
double raport = coef[i][nr_nec] / coef[nr_ec][nr_nec];
for (j = 1; j <= M + 1; ++ j)
coef[i][j] -= coef[nr_ec][j] * raport;
}
++ nr_ec, ++ nr_nec;
}
FILE *g = fopen("gauss.out", "w");
for (int i = 1; i <= N; ++ i)
{
int j;
for(j = 1; j <= M + 1; ++ j)
if (fabs(coef[i][j]) > EPS)
break;
if (j == M + 1)
{
fprintf(g, "Imposibil\n");
fclose(g);
return ;
}
sol[i] = coef[i][M + 1] / coef[i][i];
}
for (int i = 1; i <= M; ++ i)
{
double x = sol[i];
fprintf(g, "%.10lf ", x);
}
fprintf(g, "\n");
fclose(g);
}
int main()
{
Read();
Solve();
return 0;
}