Pagini recente » Cod sursa (job #1760303) | Cod sursa (job #2074063) | Cod sursa (job #356249) | Cod sursa (job #574544) | Cod sursa (job #685721)
Cod sursa(job #685721)
#include<fstream>
#include<iomanip>
using namespace std;
ifstream fin("gauss.in");
ofstream fout("gauss.out");
#define eps 0.000000001
int n, m;
double a[310][310];
double sol[310]; // sirul solutiilor
void Read(); //Functia de citire
void Gauss(); //Algoritmul lui Gauss
void Nec(); //Calculeaza necunoscutele si le afiseaza
int main()
{
Read();
Gauss();
Nec();
fin.close();
fout.close();
return 0;
}
//Citire
void Read()
{
fin >> n >> m;
for( int i = 1; i <= n; ++i )
for( int j = 1; j <= m+1; ++j )
fin >> a[i][j];
}
// Gauss
void Gauss()
{
int i = 1, j = 1, k;
double aux;
while( i <= n && j <= m )
{
// caut o linie pe care coeficientul a[k][j] este != 0
for( k = i; k <= n; ++k )
if( a[k][j] > eps || a[k][j] < -eps )
break;
if( k == n+1 ) // daca nu gasim coeficient diferit de 0 trecem la urmatoarea coloana
{
j++;
continue;
}
if( k != i ) // interschimbam liniile daca este cazul
{
for( int l = 1; l <= m+1; ++l )
{
aux = a[k][l];
a[k][l] = a[i][l];
a[i][l] = aux;
}
}
for( int l = j + 1; l <= m+1; ++l ) // impartim lunia la coef != 0...=> a[i][j] = 1;
a[i][l] /= a[i][j];
a[i][j] = 1;
for( int u = i + 1; u <= n; ++u ) // inmultim linia u cu a[i][l] cu a[u][j] si o scadem astfel sub a[i][j] vom avea 0;
{
for( int l = j + 1; l <= m+1; ++l )
a[u][l] = (a[u][j] * a[i][l]) - a[u][l];
a[u][j] = 0;
}
i++;
j++;
}
/*
for( i = 1; i <= n; ++i )
{
for( j = 1; j <= m+1; ++j )
fout << a[i][j] << ' ';
fout << '\n';
}
*/
}
void Nec()
{
int i, j;
for( i = n; i >= 1; --i )
for( j = 1; j <= m+1; ++j )
if( a[i][j] > eps || a[i][j] < -eps )
{
if( j == m+1 )
{
fout << "Imposibil" << '\n';
return;
}
sol[j] = a[i][m+1];
for( int l = j + 1; l <= m; ++l )
sol[j] = sol[j] - ( a[i][l] * sol[l] );
break;
}
for( i = 1; i <= m; ++i )
fout << sol[i] << ' ';
}