n阶行列式算法(c程序)

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

}

/*本程序的构建利用了初等变换下行列式的的不变性

和下三角方阵行列式的公式,并添加了个人的思维方式。

望不吝赐教*/

猜你喜欢

转载自www.cnblogs.com/mathstudysharing/p/n_determinant.html