Pagini recente » Cod sursa (job #1784927) | Cod sursa (job #1004611) | Cod sursa (job #1280385) | Cod sursa (job #2254445) | Cod sursa (job #2073458)
#include <fstream>
#include <cmath>
#include <iomanip>
using namespace std;
ifstream f("gauss.in");
ofstream g("gauss.out");
const double eps = 1e-8;
int N, M;
double A[301][302], x[301];
void gauss()
{
int i = 1, j = 1;
while(i <= N && j <= M)
{
if(abs(A[i][j]) <= eps) //if(A[i][i] == 0)
{
bool praf = 0;
for(int k = i + 1; k <= N; k++)
if(abs(A[k][j]) > eps) //if(A[j][i] != 0)
{
for(int l = j; l <= M + 1; l++)
swap(A[i][l], A[k][l]);
praf = 1;
break;
}
if(praf == 0)
{
j++;
continue;
}
}
for(int k = j + 1; k <= M + 1; k++)
A[i][k] /= A[i][j];
A[i][j] = 1;
for(int l = i + 1; l <= N; l++)
{
for(int k = j + 1; k <= M + 1; k++)
A[l][k] -= A[i][k] * A[l][j];
A[l][j] = 0;
}
i++, j++;
}
}
bool detsol()
{
int j;
for(int i = N; i >= 1; i--)
{
j = 1;
while(j <= M + 1 && abs(A[i][j]) <= eps) j++;
if(j == M + 1) return false;
if(j == M + 2) continue;
x[j] = A[i][M + 1];
for(int k = j + 1; k <= M; k++)
x[j] -= A[i][k] * x[k];
}
return true;
}
int main()
{
f >> N >> M;
for(int i = 1; i <= N; i++)
for(int j = 1; j <= M + 1; j++)
f >> A[i][j];
gauss();
if(detsol())
{
g << fixed << setprecision(10);
for(int i = 1; i <= M; i++)
g << x[i] << ' ';
}
else g << "Imposibil";
return 0;
}