矩阵的行列式(递归C++)

先摘一段百度百科上的搜索结果(同《信息学奥赛之数学一本通》p300):

一个n×n的方阵A的行列式记为det(A)或者|A|,一个2×2矩阵的行列式可表示如下:
在这里插入图片描述
把一个n阶行列式中的元素aij所在的第i行和第j列划去后,留下来的n-1阶行列式叫做元素aij的余子式,记作Mij。记Aij=(-1)i+jMij,叫做元素aij的代数余子式。例如:
在这里插入图片描述
一个n×n矩阵的行列式等于其任意行(或列)的元素与对应的代数余子式乘积之和,即:
在这里插入图片描述

为什么一个2*2的矩阵的行列式可以这样表示呢?我们来分析一下:
由于当A为一个1*1的矩阵时,若A=(a),则det(A)=a。那么当A为一个2*2的矩阵时,若A为最上面的2*2的矩阵,则:

det(A)=(文字描述)A第一行第一列的元素(a)乘上-1的1+1次方再乘上A中划去第一行和第一列剩下的1*1的矩阵的行列式(det(d)=d)得到a*1*d=ad;同理,得到A第一行第二列元素与其代数余子式的乘积为bc,而-1的2+1次方为-1,所以得到-bc。最后det(A)就等于(其任意行(或列)的元素与对应的代数余子式乘积之和)ad-bc。

这样,一个3*3的矩阵的行列式也就迎刃而解了,如:在这里插入图片描述

以此类推,对于一个n*n的矩阵,可任选一行或列(我选的是第一行)一步步递归求得矩阵的行列式。

下面附上代码:

#include<iostream>
#include<vector>
using namespace std;
typedef vector<int> vec;
typedef vector<vec> mat;
typedef long long ll;

mat cutoff(mat A, int n, int i) {  //切割,划去第1行第i列
	mat B(n, vec(n));
	for(int c = 0; c < n; c++)
		for(int r = 0; r < n; r++)
			B[c][r] = A[c + 1][r + (r >= i)];
	return B;
}

ll det(mat A, int n) {
	if(n == 1)
		return A[0][0];  //当A为一阶矩阵时,直接返回A中唯一的元素 
	ll ans = 0;
	for(int i = 0; i < n; i++)
		ans += A[0][i] * det(cutoff(A, n - 1, i), n - 1) * (i % 2 ? -1 : 1); 
	return ans;
}

int main() {
	int n;
	scanf("%d", &n);  //输入阶数 
	if(n == 0)
		return 0;
	mat A(n, vec(n));
	for(int i = 0; i < n; i++)
		for(int j = 0; j < n; j++)
			scanf("%d", &A[i][j]);  //输入A各行各列的元素 
	ll num = det(A, n);
	printf("%d", num);
	return 0;
}
  • 1
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值