晚上朋友说写个行列式程序,就兴致勃勃地写了下来,给大家参考。
行列式:
行列式在数学中,是一个函数,其定义域为det的矩阵A,取值为一个标量,写作det(A)或 | A | 。
行列式的计算参见《线性代数》教材。
这里要强调的是:行列式所组成的矩阵必定是个方阵,也就是说其所成矩阵的行数等于列数。
除去化简行列式为上下三角行列式的方法之外,由行列式的手工朴素解法(模拟),易得求解行列式可以使用递归的方法来求解,将大矩阵不断分解为小矩阵来缩小其规模,最后逐层返回答案。
#include <iostream>
using namespace std;
int determinant(int S,int a[][11]) { //传入参数,S代表当前行列式的阶数,a代表代数余子式所成矩阵
if(S == 2) {
return a[1][1]*a[2][2]-a[2][1]*a[1][2]; //到达边界,如果当前阶数为2,那么主对角线乘积减去副对角线乘积即可return
}
int tmp[11][11],ans=0; //tmp用于储存代数余子式所成矩阵,ans就是最后要返回的结果
int row=1,col=1;
for(int k=1;k<=S;k++) { //遍历第一行元素,这是第一个乘因子
for(int i=2;i<=S;i++) {
for(int j=1;j<=S;j++) { //这两层循环用于求代数余子式所成矩阵
if(j==k) continue; //如果当前元素刚好是被“划”掉的,那么不做任何操作
else {
tmp[row][col++]=a[i][j]; //构造tmp数组
if(col==S) { //如果到达行末了,记得换行,列数置1
col=1; row++;
}
}
}
}
ans += ((k+1)%2==0? 1: -1)* a[1][k]*determinant(S-1,tmp); //控制正负,递归求解
row=col=1; //递归过程决定接下来要构造新矩阵,所以这里一定一定要记得置1
}
return ans; //最后把答案返回
}
int main()
{
int a[11][11];
int n;
cin>>n; //输入行列式的阶数
for(int i=1;i<=n;i++) {
for(int j=1;j<=n;j++) {
cin>>a[i][j]; //按顺序输入数据
}
}
cout<<determinant(n,a)<<endl;
return 0;
}
运行实例:
upd: 只是需要计算或验证行列式的同学,你可以直接下载可执行程序食用。
exe可执行文件下载地址:
链接: https://pan.baidu.com/s/1lcQfDNWLskQMiuClg5HGpw 提取码: d8mm