行列式计算

以下用的是代数余子式计算行列式
数学结论:行列式等于它任意一行(列)的各元素与其对应的代数式余子式乘积之和。

\[\left|\begin{matrix} a_{11} & a_{12} & \cdots & a_{1n} \\ a_{21} & a_{22} & \cdots & a_{2n} \\ \vdots & \vdots & \vdots & \vdots \\ a_{n1} & a_{n2} & \cdots & a_{nn} \end{matrix} \right| = (-1)^{1 + 1}a_{11} \left|\begin{matrix} a_{22} & a_{23} & \cdots & a_{2n} \\ \vdots & \vdots & \vdots & \vdots \\ a_{n2} & a_{n3} & \cdots & a_{nn} \end{matrix} \right| + (-1)^{1 + 2}a_{12} \left|\begin{matrix} a_{21} & a_{23} & \cdots & a_{2n} \\ \vdots & \vdots & \vdots & \vdots \\ a_{n1} & a_{n3} & \cdots & a_{nn} \end{matrix} \right| + \cdots + (-1)^{1 + n}a_{1n} \left|\begin{matrix} a_{21} & a_{22} & \cdots & a_{2n-1} \\ \vdots & \vdots & \vdots & \vdots \\ a_{n1} & a_{n2} & \cdots & a_{nn-1} \end{matrix} \right| \]

所以,我们可以直接默认取第一行与其对应的代数余子式的乘积之和,利用递归求出行列式的值。

代码

#include <iostream>

using namespace std;

typedef long long ll;

const int N = 10;

ll a[N][N];

ll cal(ll a[N][N], int n)
{
    if (n == 1) return a[1][1]; // 1行1列直接返回该值
    ll res = 0;
    for (int t = 1; t <= n; t ++) // 枚举第1行的每一列
    {
        ll na[N][N] = {}; // 余子式 
        for (int i = 2, ri = 1; i <= n; i ++, ri ++) // 从第2行开始枚举 
            for (int j = 1, cj = 1; j <= n; j ++, cj ++) // 枚举每一列,除和第一行同一列的数 
            {
                if (j == t) continue; // 同列不选
                na[ri][cj] = a[i][j]; 
            }
        res += (t % 2 ? 1 : -1) * a[1][t] * cal(na, n - 1); // 将每个代数余子式求和,同时递归求余子式
    } 
    return res; 
}

int main()
{
    int n;
    cin >> n;
    
    for (int i = 1; i <= n; i ++)
        for (int j = 1; j <= n; j ++)
            cin >> a[i][j];
    
    cout << cal(a, n);
    
    return 0;
}
posted @ 2024-09-26 22:23  Natural_TLP  阅读(4)  评论(0编辑  收藏  举报