Pagini recente » Cod sursa (job #464703) | Cod sursa (job #379109) | Cod sursa (job #3233143) | Cod sursa (job #1100109) | Cod sursa (job #902961)
Cod sursa(job #902961)
#include <fstream>
#include <iomanip>
#include <cstdlib>
using namespace std;
#define EPS 0.0000001
fstream f("gauss.in", ios::in), g("gauss.out", ios::out);
float a[303][303],X[303];
int m,n;
void solve();
void cauta(int,int);
void schimba(int,int);
void redu(int,int,float);
void imparte(int,float);
bool nonz ();
int main()
{
f>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m+1;j++)
f>>a[i][j];
solve();
for(int i=1;i<=m;i++)
{
g<<fixed<<setprecision (8)<<X[i]<<" ";
}
return 0;
}
void solve()
{
for(int i=1,j=1;i<=n && j<=m;j++,i++)
{
if (a[i][j]==0)
cauta(i,j);
if(a[i][j]!=0)
{
imparte(i,a[i][j]);
for(int l=i+1;l<=n;l++)
{
float d=a[l][j];
redu(j,l,d);
}
}
else
j--;
}
for(int i = n; i>0; --i)
for(int j = 1; j <= m+1; ++j)
if(a[i][j]>EPS || a[i][j]<-EPS)
{
if(j == m+1)
{
g<<"Imposibil"<<endl;
exit(0);
}
X[j] = a[i][m+1];
for(int k = j+1; k <= m; ++k)
X[j] -= X[k] * a[i][k];
break;
}
}
void cauta(int x,int y)
{
int i=x+1;
while(a[i][y]==0 && i<=n)
i++;
if (i<=n)
schimba(y,i);
}
void schimba(int x,int y)
{
int aux;
for(int j=1;j<=m+1;j++)
{
aux=a[x][j];
a[x][j]=a[y][j];
a[y][j]=aux;
}
}
void redu(int i, int j, float d)
{
for(int k=i;k<=m+1;k++)
{
a[j][k]=a[j][k]-a[i][k]*d;
}
}
void imparte(int i, float d)
{
for(int k=i;k<=m+1;k++)
a[i][k]/=d;
}
bool nonz()
{
bool bo=true;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m && bo==true;j++)
if (a[i][j]!=0)
bo=false;
if (bo==true && a[i][(int)m+1]!=0)
return false;
}
return true;
}