#include "stdio.h"
#include "math.h"
#define MAXNUM 10 //變量數量
int array[MAXNUM][MAXNUM]={{2,1,0,0,1},{1,3,1,0,2},{0,1,1,1,2},{0,0,2,1,0}};
int unuse_result[MAXNUM];
int GaussFun(int equ,int var,int result[])
{
int i,j,k,col,num1,num2;
int max_r,ta,tb,gcdtemp,lcmtemp;
int temp,unuse_x_num,unuse_index;
col=0;
for (k=0;k<equ && col<var;k++,col++)
{
max_r=k;
for (i=k+1;i<equ;i++)
{
if (abs(array[i][col])>abs(array[max_r][col]))
{
max_r=i;
}
}
if (max_r!=k)
{
for (j=k;j<var+1;j++)
{
temp=array[k][j];
array[k][j]=array[max_r][j];
array[max_r][j]=temp;
}
}
if (array[k][col]==0)
{
k--;
continue;
}
for (i=k+1;i<equ;i++)
{
if (array[i][col]!=0)
{
num1=abs(array[i][col]);
num2=abs(array[k][col]);
while (num2!=0)
{
temp=num2;
num2=num1%num2;
num1=temp;
}
gcdtemp=num1;
lcmtemp=(abs(array[i][col])*abs(array[k][col]))/gcdtemp;
ta=lcmtemp/abs(array[i][col]);
tb=lcmtemp/abs(array[k][col]);
if (array[i][col]*array[k][col]<0)
{
tb=-tb;
}
for (j=col;j<var+1;j++)
{
array[i][j]=array[i][j]*ta-array[k][j]*tb;
}
}
}
}
for (i=k;i<equ;i++)
{
if (array[i][col]!=0)
{
return -1;
}
}
if (k<var)
{
for (i=k-1;i>=0;i--)
{
unuse_x_num=0;
for (j=0;j<var;j++)
{
if (array[i][j]!=0 && unuse_result[j])
{
unuse_x_num++;
unuse_index=j;
}
}
if (unuse_x_num>1)
{
continue;
}
temp=array[i][var];
for (j=0;j<var;j++)
{
if (array[i][j]!=0 && j!=unuse_index)
{
temp=array[i][j]*result[j];
}
}
result[unuse_index]=temp/array[i][unuse_index];
unuse_result[unuse_index]=0;
}
return var-k;
}
for (i=var-1;i>=0;i--)
{
temp=array[i][var];
for (j=i+1;j<var;j++)
{
if (array[i][j]!=0)
{
temp-=array[i][j]*result[j];
}
}
if (temp%array[i][i]!=0)
{
return -2;
}
result[i]=temp/array[i][i];
}
return 0;
}
void main()
{
int i,type;
int equnum,varnum;
int result[MAXNUM];
equnum=3;
varnum=3;
type=GaussFun(equnum,varnum,result);
if (type==-1)
{
printf("該方程無解!\n");
}
else if(type==-2)
{
printf("該方程有浮點數解,無整數解!\n");
}
else if (type>0)
{
printf("該方程有無窮多個解!自由變量數量為%d\n",type);
for (i=0;i<varnum;i++)
{
if (unuse_result[i])
{
printf("x%d 是不確定的\n",i+1);
}
else
{
printf("x%d:%d\n",i+1,result[i]);
}
}
}
else
{
printf("該方程的解為:\n");
for (i=0;i<varnum;i++)
{
printf("x%d=%d\n",i+1,result[i]);
}
}
}