c語言求方陣的行列式、伴隨矩陣算法

#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");

    }

    

    

}

相關文章
相關標籤/搜索