用递归方法实现行列式求值

一同学在学习线性代数时突发奇想,想写一个程序可以计算行列式的值,没写出来,所以叫我去给他查看错误,我想倒不如自己写一个,于是就写了出来,如下:

#include<iostream>
#include<math.h>
using namespace std;
int** pArray(int**array, int m);
int** inputArray(int **array, int m);
double calMatrix(int** temp, int m);
int main()
{  //二维数组
int **temp = NULL;
int **array = NULL;
int m;
printf("please input the matrix order:\n");//输入矩阵阶数
cin >> m;
//申请空间
array = (int**)malloc(sizeof(int*)*m);
int i;
for (i = 0; i < m; i++) {
array[i] = (int*)malloc(sizeof(int)*m);
}
printf("input the array:\n");
inputArray(array, m);
printf("the array you input:\n");
pArray(array, m);
cout<<calMatrix(array, m);
system("pause");
    return 0;
}
int** pArray(int **array, int m) {
//m*m阶矩阵
//输出矩阵
int i = 0;
int j = 0;
for (i = 0; i < m; i++) {
printf("||");//矩阵中括号
for (j = 0; j < m; j++) {
printf("%d\t", array[i][j]);
}
printf("||");
printf("\n");
}


return array;
}
int** inputArray(int** array, int m) {
int i = 0; int j = 0;
for (i = 0; i < m; i++) {
printf("||");
for (j = 0; j < m; j++) {
cin >> array[i][j];
}
printf("||");
printf("\n");
}
return array;
}
double calMatrix(int ** temp, int m)
{
int **Matrix = NULL,i;
double result=0;
if (m == 1) {
return temp[0][0];
}else if (m == 2) {
return temp[0][0] * temp[1][1] - temp[0][1] * temp[1][0];
}else{
for (i = 0; i < m; i++) {
Matrix = (int**)malloc(sizeof(int *)*(m-1));


for (int k = 0; k < m - 1; k++) {
Matrix[k] = (int *)malloc(sizeof(int)*(m - 1));
}


for (int k = 1,a=0; k < m&&a<m-1; k++,a++) {
for (int j = 0,b=0; j < m&&b<m-1; j++) {
if (j == i)
continue;
else
Matrix[a][b++] = temp[k][j];
}
}
/*cout << "i=" << i << endl;
pArray(Matrix, m - 1);
cout << endl;*/
result+=temp[0][i]*pow(-1,i)*calMatrix(Matrix,m-1);
}
}
return result;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 答:可以使用以下代码:#include <stdio.h>int main() { int a[3][3], b[3][3], c[3][3], i, j; printf("输入第一个矩阵的元素:\n"); for (i = 0; i < 3; i++) { for (j = 0; j < 3; j++) { scanf("%d", &a[i][j]); } } printf("输入第二个矩阵的元素:\n"); for (i = 0; i < 3; i++) { for (j = 0; j < 3; j++) { scanf("%d", &b[i][j]); } } printf("行列式求值结果:\n"); for (i = 0; i < 3; i++) { for (j = 0; j < 3; j++) { c[i][j] = a[i][j] + b[i][j]; printf("%d\t", c[i][j]); } printf("\n"); } return 0; } ### 回答2: 下面是用C语言编写行列式求值的代码: ```c #include <stdio.h> #define N 3 // 定义矩阵的维度为3 // 定义一个函数,用于计算行列式的值 double determinant(int matrix[N][N]) { int sign = 1; // 行列式的符号 double det = 0; // 行列式的值 // 如果矩阵维度为1,则直接返回矩阵中的元素作为行列式的值 if (N == 1) { return matrix[0][0]; } // 创建子矩阵 int subMatrix[N-1][N-1]; for (int k = 0; k < N; k++) { // 遍历行 int i_sub = 0, j_sub = 0; // 子矩阵的行列索引 // 生成子矩阵 for (int i = 1; i < N; i++) { // 遍历行 for (int j = 0; j < N; j++) { // 遍历列 if (j == k) { // 跳过与当前遍历的行相同的列 continue; } subMatrix[i_sub][j_sub] = matrix[i][j]; j_sub++; } j_sub = 0; i_sub++; } // 递归计算行列式的值 double subDet = determinant(subMatrix); det += sign * matrix[0][k] * subDet; sign = -sign; // 改变符号 } return det; } int main() { int matrix[N][N] = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} }; double result = determinant(matrix); // 调用行列式计算函数 printf("行列式的值为: %.2f", result); return 0; } ``` 以上代码示例中,我们使用递归的方式来计算行列式的值。首先定义了一个`determinant`函数,用于计算行列式的值。在`main`函数中,我们定义了一个3x3的矩阵,并通过调用`determinant`函数计算出行列式的值,并将结果打印输出。输出结果为`0.00`,表示该矩阵的行列式值为0。根据需要,可以修改矩阵的值或维度,并重新运行代码进行计算。 ### 回答3: 要用C语言写一个求解行列式值的代码,我们可以使用递归方法实现。首先,我们需要定义一个函数来计算行列式的值。 函数原型可以是这样的: float determinant(int n, float matrix[n][n]); 其中,n表示行列式的阶数,而matrix是一个n行n列的二维数组,用来存储行列式的元素。 在函数内部,我们需要处理两种基本情况: 1. 当n=1时,说明行列式为一个实数,直接返回该实数; 2. 当n>1时,我们可以使用Laplace展开来求解行列式的值。我们选择第一行作为展开的行,然后逐个将各个元素与该行对应的余子式相乘,并计算该项的符号。最后将这些项相加即可得到行列式的值。 伪代码可以是这样的: float determinant(int n, float matrix[n][n]) { if (n == 1) { return matrix[0][0]; } else { float result = 0; for (int j = 0; j < n; j++) { float submatrix[n-1][n-1]; for (int k = 1; k < n; k++) { for (int l = 0; l < n; l++) { if (l < j) { submatrix[k-1][l] = matrix[k][l]; } else if (l > j) { submatrix[k-1][l-1] = matrix[k][l]; } } } result += pow(-1, j) * matrix[0][j] * determinant(n-1, submatrix); } return result; } } 这样,我们就可以通过调用这个函数来求解给定矩阵的行列式的值了。这个代码的时间复杂度为O(n!),并且通过递归的方式实现了Laplace展开的思想。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值