c语言求方阵的行列式、伴随矩阵算法

孤者浪人 提交于 2020-04-14 19:22:05

【推荐阅读】微服务还能火多久?>>>

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

    }

    

    

}

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!