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


#include<stdio.h>

#include<math.h>

#define N 100 //N比輸入的階數大即可

int main()

{   int n,a[N][N],b[N][N],i,j;

    int row_col_times(int b[N][N],int n);

    void adgujate_matrix(int s[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]);

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

    }

    

    

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM