Pagini recente » Cod sursa (job #876148) | Cod sursa (job #2026771) | Cod sursa (job #2072072) | Istoria paginii runda/iuiui/clasament | Cod sursa (job #1247807)
#include <fstream>
#include <iomanip>
#define NMAX 300
#define MMAX 300
#define epsi 0.0000000001
using namespace std;
ifstream f("gauss.in");
ofstream g("gauss.out");
double A[NMAX+1][MMAX+1],sol[MMAX];
int n,m,bad=0;
void read()
{
f>>n>>m;
int i,j;
for(i=1;i<=n;i++)
for(j=1;j<=m+1;j++)
f>>A[i][j];
}
void show()
{
int i,j;
for(i=1;i<=n;i++)
{
for(j=1;j<=m+1;j++)
g<<setw(9)<<A[i][j]<<' ';
g<<'\n';
}
}
bool egal ( double a , double b )
{
if ( abs(a-b) < epsi )
return 1;
else return 0;
}
void interChange ( int i, int k )
{
int j;
double aux;
for(j=1;j<=m+1;j++)
{
aux = A[i][j];
A[i][j] = A[k][j];
A[k][j] = aux;
}
}
void kill ( int a, int b )
{
int i,j;
double d;
for( i=a+1; i<=n; i++)
{
d=A[i][b]/A[a][b];
for( j=b; j<=m+1; j++)
{
A[i][j]-=A[a][j]*d;
}
}
}
void solve ()
{
int i=1,j=1,k;
double d;
while( i<=n && j<=m )
{
for( k=i ; k<=n ; k++ )
if( ! egal(A[k][j],0) ) break;
if(k == n+1) { j++;}
else
{
if(k!=i) interChange(i,k);
d=A[i][j];
for(k=j;k<=m+1;k++)
A[i][k]/=d;
kill(i,j);
i++; j++;
}
}
}
void getSol()
{
int i,j;
for( i=n; i>=1; i--)
{
sol[i]=A[i][m+1];
for( j=i+1; j<=m; j++)
{
sol[i]-=sol[j]*A[i][j];
}
if( egal( A[i][i], 0) && ( !egal(sol[i],0)) )
{
g<<"Imposibil"; bad=1;
break;
}
}
}
int main()
{
int i, j;
read();
solve(); // reduces to echeleon form
//show();
//g<<'\n';
getSol();
if(!bad)
{
for(i=1;i<=m;i++)
g<<sol[i]<<' ';
}
}