Pagini recente » Cod sursa (job #1530539) | Cod sursa (job #2977500) | Cod sursa (job #1807330) | Cod sursa (job #2797962) | Cod sursa (job #2730165)
#include <bits/stdc++.h>
using namespace std;
ifstream fi("gauss.in");
ofstream fo("gauss.out");
const int NMAX = 305;
int n, m;
long double A[NMAX][NMAX];
long double sol[NMAX];
void afis() {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m + 1; j++)
cout << A[i][j] << " ";
cout << "\n";
}
cout << "\n";
}
void swapLinii(int a, int b) {
for (int j = 1; j <= m + 1; j++)
swap(A[a][j], A[b][j]);
}
void redu() {
int i = 1, j = 1;
while (i <= n && j <= m) {
// caut prima linie care are ceva pe j
int i2 = i;
while (i2 <= n && A[i2][j] == 0)
i2++;
if (i2 > n) {
j++;
continue;
}
swapLinii(i, i2);
long double coef = A[i][j];
for (int j2 = j; j2 <= m + 1; j2++)
A[i][j2] /= coef;
// le nulizez pe celelalte
for (int i2 = i + 1; i2 <= n; i2++) {
long double coef = A[i2][j];
for (int j2 = j; j2 <= m + 1; j2++)
A[i2][j2] -= A[i][j2] * coef;
}
i++; j++;
}
}
void rezolva() {
for (int i = n; i >= 1; i--) {
int pr = 1;
while (A[i][pr] == 0 && pr <= m)
pr++;
if (pr > m)
continue;
sol[pr] = A[i][m + 1];
for (int j = pr + 1; j <= m; j++)
sol[pr] -= A[i][j] * sol[j];
}
}
bool verif() {
for (int i = 1; i <= n; i++) {
long double sum = 0;
for (int j = 1; j <= m; j++)
sum += sol[j] * A[i][j];
if (abs(sum - A[i][m + 1]) >= 1e-7)
return 0;
}
return 1;
}
int main()
{
fi >> n >> m;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m + 1; j++)
fi >> A[i][j];
}
redu();
rezolva();
if (!verif()) {
fo << "Imposibil";
return 0;
}
for (int i = 1; i <= m; i++)
fo << fixed << setprecision(10) << sol[i] << " ";
return 0;
}