Исключением переменных.
code:
#undef DEBUG
/* #define L 4 */
/* #define C 5 */
/* #define real long double */
/* real M[L][C]; */
#ifndef abs
#define abs(N) ((N>0)?(N):(-(N)))
#endif
{
int i,j,k;
int lead,maxlead;
for(i=lead=0;(i<L)&&(lead<C);i++,lead++)
{
/* Maximal by absolute value leading element search */
{ real max=0;
for(j=i;j<L;j++)
if(abs(M[j][lead])>max)
{ maxlead=j; max=abs(M[j][lead]); };
/* If no maximal leading element */
if(max==0) { i--; continue; };
};
/* Swap lines #i and #maxlead */
if(i!=maxlead)
{ real t;
for(j=lead;j<C;j++)
{ t=M[i][j];
M[i][j]=M[maxlead][j];
M[maxlead][j]=t;
};
};
/* Now subtract from each line below #i line #i */
for(j=i+1;j<L;j++)
{ real ratio=M[j][lead]/M[i][lead];
for(k=lead+1;k<C;k++)
M[j][k]-=M[i][k]*ratio;
M[j][lead]=0;
};
/* Next line */
};
/* Backward pass */
for(i=L-1;i>0;i--)
{
/* Determine leading element */
for(lead=0;(lead<C)&&(M[i][lead]==0);lead++);
if(lead==C) continue;
/* Subtract current line from upper lines */
for(j=0;j<i;j++)
{ real ratio=M[j][lead]/M[i][lead];
for(k=lead+1;k<C;k++)
M[j][k]-=M[i][k]*ratio;
M[j][lead]=0;
};
/* Next line */
};
/* Normalize */
for(i=0;i<L;i++)
{
/* Determine leading element */
for(lead=0;(lead<C)&&(M[i][lead]==0);lead++);
if(lead==C) continue;
/* Divide line on leading element */
for(j=lead+1;j<C;j++) M[i][j]/=M[i][lead];
M[i][lead]=1;
};
/* Finished */
};
---
...Я работаю...