Pagini recente » Borderou de evaluare (job #2051299) | Cod sursa (job #2056613) | Cod sursa (job #843875) | Cod sursa (job #704980) | Cod sursa (job #2086344)
#include <fstream>
#include <iomanip>
using namespace std;
#define epsilon 0.000000001
ifstream fin ("gauss.in");
ofstream fout ("gauss.out");
int n,m,i,k,j,t,ok;
double sol[301],a[310][310],aux;
int main(){
fin>>n>>m;
for(i=1;i<=n;i++)
for(j=1;j<=m+1;j++)
fin>>a[i][j];
i=j=1;
while(i<=n && j<=m){
if(a[i][j]){
//imparti peste tot cu primul ca sa ai coef 1 la primul
for(k=m+1;k>=j+1;k--)
a[i][k]/=a[i][j];
a[i][j]=1;
//scazi linia k cu linia i * primul de pe linia k ca sa se reduca primul de pe linia k
for(k=i+1;k<=n;k++){
for(t=j+1;t<=m+1;t++){
a[k][t]-=a[k][j]*a[i][t];
}
a[k][j]=0;
}
++i;
++j;
}
else{
ok=0;
//cautam prima linie cu xj nenul
for(k=i+1;k<=n;k++)
if(a[k][j]){
ok=1;
break;
}
//daca coloana e 0 => xj termen liber, trecem mai departe
if(!ok){
++j;
}
else{
//altfel, interschimbam prima linie cu xj>=1 cu linia curenta
for(t=1;t<=m+1;t++){
aux=a[k][t];
a[k][t]=a[i][t];
a[i][t]=aux;
}
}
}
}
for(i=n;i>=1;i--){
//verificam daca a[i][j] e 0 (cu eroare epsilon)
for(j=1;j<=m+1;j++)
if(a[i][j]>epsilon || a[i][j]<(-epsilon))
break;
//toata linia 0
if(j==m+2)
continue;
//toata linia 0 in afara de ultima valoare, cea de dupa = ; deci ec arata ceva gen 0=a
//=> ec nu are sol
if(j==m+1){
fout<<"Imposibil";
return 0;
}
sol[j]=a[i][m+1];
//aici facem schema unde aflam sol de fiecare xj
//adica sol = m+1 - sol de dupa j * coef lor din ecuatia i
for(k=j+1;k<=m;k++)
sol[j]-=sol[k]*a[i][k];
}
for(i=1;i<=m;i++){
fout<<setprecision(10)<<fixed<<sol[i]<<" ";
}
//fin
}