/*求行列式的值
函数介绍:输入一个行列式,求其值
*/
#include <iostream>
using namespace std;
const int N = 10; //行列式的阶数
void Create1(int H[][N]); //构造一个行列式
void Create2(int H[][N]); //构造一个行列式
void PrintH(const int H[][N]); //输出行列式
int HLS(const int a[][N], int n);//输入一个行列式,求其值
void YZS(int Y[][N], const int a[][N], int len, int a_r);//求行列式当前元素的余子式
int main()
{
int a[N][N] = {0};
// Create1(a); //构造一个行列式
Create2(a); //构造一个行列式
PrintH(a); //输出行列式
cout << HLS(a,N) << endl;
getchar();
return 0;
}
void Create1(int H[][N])
{
int i, j;
printf("请按标准格式输入行列式:每行%d个数值,用空格隔开\n", N);
for (i=0; i<N; i++)
{
for(j=0; j<N; j++)
scanf("%d", &H[i][j]);
fflush(stdin);
}
}
void Create2(int H[][N])
{
int i, j;
for(i=0; i<N; i++)
for(j=0; j<N; j++)
H[i][j] = rand()%4;
}
void PrintH(const int H[][N])
{
int i, j;
for (i=0; i<N; i++)
{
for(j=0; j<N; j++)
printf("%d ", H[i][j]);
printf("\n");
}
}
/*函数介绍:输入一个行列式,用递归的方法,以行列式的行序为主序求行列式的值
输入参数:const int a[][N] :一个以二维数组形式存储的行列式
int n:行列式的阶数
输出参数:无
返回值: int :行列式的值
*/
int HLS(const int a[][N], int n)
{
if (n == 1) //如果行列式的阶数为1,直接返回其值
{
return a[0][0];
}
else //否则按照求代数余子式的方法,采用递归方式求行列式的值
{
int sum = 0; //用来存储当前行列式(可能是上一层行列式的余子式)的值
for (int i=0; i<n; i++)//以行列式的行序为主序求行列式的值
{
int Y[N][N] = {0}; //存储行列式当前元素的余子式
YZS(Y, a, n, i); //求行列式当前元素的余子式
int xs = (i%2 == 0) ? 1 : -1; //计算行列式当前元素的代数余子式的系数
sum += xs * a[i][0] * HLS(Y, n-1);//累积当前行列式的值
}
return sum;
}
}
/*函数介绍:输入一个行列式及其第0列第a-r行元素,求该元素的余子式
输入参数:const int a[][N] :一个以二维数组形式存储的行列式
int n:行列式的阶数
int a_r:元素的行号(列号默认为0)
输出参数:int Y[][N]:该元素的余子式
返回值: void
*/
void YZS(int Y[][N], const int a[][N], int len, int a_r)
{
int r = 0;
int c = 0;
for (int i=0; i<len; i++)
{
if (i != a_r)
{
for (int j=1; j<len; j++)
{
Y[r][c++] = a[i][j];
}
r++;
c = 0;
}
}
}
评论