#include<stdio.h>
#include<math.h>
#define N 100 //N比輸入的階數大即可
int main()
{ int n,a[N][N],i,j;
void row_col_times(int b[N][N],int n);
printf("請輸入方陣階數:\n");
scanf("%d",&n);
printf("請輸入%d階的方陣(用空格隔開)\n",n);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%d",&a[i][j]);
printf("您輸入的%d階方陣是:\n");
for(i=0;i<n;i++)
{for(j=0;j<n;j++)
{printf("%3d ",a[i][j]);}//右對齊輸出矩陣
printf("\n");}
row_col_times(a,n);//調用行列式乘積函數
return 0;
}
void row_col_times(int b[N][N],int n)
{ int change_col(int c[N][N],int n,int i);
int product(int d[N][N],int n,int p);
int i,j,k,p=0;
for(i=0;i<n-1;i++)//i為階數
{
if(b[i][i]==0)//當對角線元素為零時調換列
{ p=p+change_col(b,n,i);}
for(j=i+1;j<n;j++)//j指列
{
for(k=i+1;k<n;k++)//k指行
b[k][j]=b[k][j]*b[i][i]-b[k][i]*b[i][j];//最重要的操作
}
}
printf("the det of array is:%d",product(b,n,p));//調用對角線乘積+符號函數
}
int change_col(int c[N][N],int n,int i)
{ int temp,j,k,flag=0;
for(k=i;k<n;k++)//k指列
{ if(c[i][k]!=0)
{
for(j=i;j<n;j++)//j指行
{
temp=c[j][i];
c[j][i]=c[j][k];
c[j][k]=temp;//調換列
}
flag++;//列調換符號記錄
break;
}
}
return flag;//返回調換符號記錄數
}
int product(int d[N][N],int n,int p)
{ int product=1,i;
for(i=0;i<n;i++)
product=product*d[i][i];//對角線乘積
for(i=0;i<n-1;i++)
product=product/pow(d[i][i],n-i-1);//除回來
product=product*pow(-1,p);//乘上列調換符號
return product;
}
/*本程序的構建利用了初等變換下行列式的的不變性
和下三角方陣行列式的公式,並添加了個人的思維方式。
望不吝賜教*/
