Pagini recente » Borderou de evaluare (job #1731294) | Clasament cerculdeinfo-lectia8-kmpzmanacher | Clasament stargold | Cod sursa (job #555822) | Cod sursa (job #847905)
Cod sursa(job #847905)
#include <cstdio>
const int MAX_SIZE(301);
const double GUARD(0.0000001);
int n, m;
long double matrix [MAX_SIZE] [MAX_SIZE];
long double unknown [MAX_SIZE];
long double result [MAX_SIZE];
bool error;
inline void read (void)
{
std::freopen("gauss.in","r",stdin);
std::scanf("%d %d",&n,&m);
int i, j;
for (i = 1 ; i <= n ; ++i)
{
for (j = 1 ; j <= m ; ++j)
std::scanf("%Lf",&matrix[i][j]);
std::scanf("%Lf",result + i);
}
std::fclose(stdin);
}
inline void print (void)
{
std::freopen("gauss.out","w",stdout);
if (error)
std::printf("Imposibil\n");
else
for (long double *iterator(unknown + 1), *end(unknown + m) ; iterator <= end ; ++iterator)
std::printf("%.10Lf ",*iterator);
std::fclose(stdout);
}
inline void swap (long double &a, long double &b)
{
long double temp(a);
a = b;
b = temp;
}
inline void compute (void)
{
int i(1), j(1), k, index;
while (i <= n && j <= m)
{
for (k = i ; k <= n ; ++k)
if (matrix[k][j] < -GUARD || matrix[k][j] > GUARD)
break;
if (k > n)
{
++j;
continue;
}
if (k != i)
{
for (index = 1 ; index <= m ; ++index)
swap(matrix[i][index],matrix[k][index]);
swap(result[i],result[k]);
}
for (index = j + 1 ; index <= m ; ++index)
matrix[i][index] /= matrix[i][j];
result[i] /= matrix[i][j];
matrix[i][j] = 1;
for (k = i + 1 ; k <= n ; ++k)
{
for (index = j + 1 ; index <= m ; ++index)
matrix[k][index] -= matrix[i][index] * matrix[k][j];
result[k] -= result[i] * matrix[k][j];
matrix[k][j] = 0;
}
++i;
++j;
}
for (i = n ; i ; --i)
{
for (j = 1 ; j <= m ; ++j)
if (matrix[i][j] < -GUARD || matrix[i][j] > GUARD)
break;
if (j > m && (result[i] > GUARD || result[i] < -GUARD))
{
error = true;
break;
}
unknown[j] = result[i];
for (k = j + 1 ; k <= m ; ++k)
unknown[j] -= matrix[i][k] * unknown[k];
}
}
int main (void)
{
read();
compute();
print();
return 0;
}