#include<stdio.h>函數
#include<math.h>3d
#define N 100 //N比輸入的階數大便可io
int main()im
{ int n,a[N][N],b[N][N],i,j;di
int row_col_times(int b[N][N],int n);co
void adgujate_matrix(int s[N][N],int n);回調
printf("請輸入方陣階數:\n");time
scanf("%d",&n);math
printf("請輸入%d階的方陣(用空格隔開)\n",n);return
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]);
b[i][j]=a[i][j];
}//右對齊輸出矩陣
printf("\n");}
printf("該矩陣的伴隨矩陣是;:\n");
adgujate_matrix(b,n);//調用伴隨矩陣函數
printf("該矩陣的行列式爲: %d\n",row_col_times(a,n));//調用行列式乘積函數
return 0;
}
int 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];//最重要的操做
}
}
return 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;
}
void adgujate_matrix(int s[N][N],int n)
{
int b[n][n],c[N][N],f[n][n];
int i,j,k,l,a,e,g=1;
for(j=0;j<n;j++)
for(i=0;i<n;i++)
f[i][j]=s[i][j];//賦值防止改變原矩陣
for(j=0;j<n;j++)//依次找元素
{
for(i=0;i<n;i++)
{
for(k=0;k<n;k++)
for(l=j;l<n-1;l++)
{
s[k][l]=s[k][l+1];
//右邊往左挪
}
for(k=i;k<n-1;k++)
for(l=0;l<n;l++)
{
s[k][l]=s[k+1][l];
//下邊往上挪
}
for(k=0;k<n-1;k++)
for(l=0;l<n-1;l++)
{
c[k][l]=s[k][l];
}
if((i+j)%2==1)
g=-1;
printf("%3d",row_col_times(c,n-1)*g);
for(a=0;a<n;a++)
for(e=0;e<n;e++)
s[a][e]=f[a][e];
g=1;
}
printf("\n");
}
}