首页 > 代码库 > 求行列式的值(递归)
求行列式的值(递归)
/* #include <math.h> #include <stdio.h> #define N 100 #define LIM -100000000 float det(float a[N][N],int n){ if(n==1) return a[0][0]; if(n==2) return a[0][0]*a[1][1]-a[0][1]*a[1][0];// the base situation else{ int j,i,flag=1; float ret=0; for(j=0;j<n;j++){//j is the column int st_c=0,st_r=0; float a0j=a[0][j]; flag=-flag; a[0][j]=LIM; for(i=1;i<n;i++){//compose the trans_a a[i][j]=LIM; }//end reseting a float trans_a[N][N]; for(i=1;i<n;i++){ for(j=0;j<n;j++){ if(a[i][j]!=LIM){ if(st_c==n-1){ st_r++; st_c=0; } trans_a[st_r][st_c]=a[i][j]; st_c++; } }//end composing } ret+=det(trans_a,n-1)*a0j*flag; printf("%f\n",ret); } return det(a,n-1); } } int main(){ printf("Please enter matrix size n(1<=n<20):"); int n; scanf("%d",&n); printf("Please input matrix line by line:\n"); float a[N][N]; int i,j; for(i=0;i<n;i++) for(j=0;j<n;j++) scanf("%f",&a[i][j]); printf("matrix a:\n"); for(i=0;i<n;i++){ for(j=0;j<n;j++) printf("%6.1f",a[i][j]);//the elements printf("\n"); } printf("result = %f\n",det(a,n));//the res return 0; }*/ #include <math.h> #include <stdio.h> #define CONST 1e-6 #define SIZE 20 void InputMatrix (double a[][SIZE], int n); double DeterminantValue(double a[][SIZE], int n); void SubMatrix(double a[][SIZE], double b[][SIZE], int n, int row, int col); void PrintMatrix(double a[][SIZE], int n); int main(void) { double a[SIZE][SIZE]; int n; double result; printf("Please enter matrix size n(1<=n<%d):", SIZE); scanf("%d", &n); printf("Please input matrix line by line:\n"); InputMatrix(a, n); printf("matrix a:\n"); PrintMatrix(a, n); printf("\n"); result = DeterminantValue(a, n); printf("result = %f\n", result); return 0; } // 函数功能: 输入一个n×n矩阵的元素 void InputMatrix (double a[][SIZE], int n) { int i, j; for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { scanf("%lf", &a[i][j]); } } } // 函数功能: 计算n×n矩阵的行列式的值 double DeterminantValue(double a[][SIZE], int n) { int i = 0, j = 0; double temp, result, b[SIZE][SIZE]; if (n == 1) { result = a[0][0]; } else if (n == 2) { result = a[0][0] * a[1][1] - a[0][1] * a[1][0]; } else { result = 0.0; for (j = 0; j < n; j++)//遍历列 { SubMatrix(a, b, n, i, j);//the key printf("Submatrix:\n"); PrintMatrix(b, n - 1); temp = DeterminantValue(b, n - 1); //递归 result += pow(-1, i + j) * a[0][j] * temp; printf("DValue of the Submatrix is %6.1f\n", temp); } } return result; } // 函数功能: 计算n×n矩阵a中第row行col列元素的(n-1)×(n-1)子矩阵b void SubMatrix(double a[][SIZE], double b[][SIZE], int n, int row, int col) { int i, j, ii = 0, jj = 0; for (i = 0; i < n; i++) { jj = 0;//回归0 for (j = 0; j < n; j++)//复制第j列的数 { if (i != row && j != col)//过滤行列为i j的项 { b[ii][jj] = a[i][j]; jj++; } } if (i != row && j != col)//复制完后向下推进一行 { ii++;//////////////////////////////////////////////////////// } ///////两次的i!=row&&...直接不考虑row,col上的数///////// } //////////////////////////////////////////////////////// } // 函数功能: 输出一个n×n矩阵的元素 void PrintMatrix(double a[][SIZE], int n) { int i, j; for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { printf("%6.1f\t", a[i][j]); } printf("\n"); } }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。