在这里向大家介绍两种实现n阶行列式计算的方法
目录
1.展开法
2.全排列法
一.展开法:
展开法的实现思想就是利用递归不断将行列式某一行或者某一列的n-1个(假设行列式为n行n列)置为0,剩余一个置为1,并不断展开进行计算,接下来让我们来看看代码
?
?
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>
double Getnum(double arr[][20], int n)
{
if (n == 1)
return arr[0][0];
if (n == 2) //若行列式行列数只剩下2,则使用交叉相乘计算并返回值
return arr[0][0] * arr[1][1] - arr[0][1] * arr[1][0];
for (int i = 0; i < n; i++)
{
arr[i][n - 1] = arr[i][n - 1] / arr[n - 1][n - 1]; //将arr[n-1][n-1]赋值为1
}
double flag = arr[n - 1][n - 1];
//将最后一行的值赋为0(除最后一个数之外)
for (int i = 0; i < n ;i++)
for (int j = 0; j < n-1; j++)
{
arr[i][j] = arr[i][j] - arr[i][n-1] * arr[n-1][j];
//原理为将行列式每一列与k倍(n-1)列相减,其中k值为最后一行的第j列元素,当循环到最后一行时,
// 因为arr[n-1][n-1]等于1,所以最后一行的n-1个元素结果会为0
}
return flag * pow(-1.0, 2*n - 2)*Getnum(arr, n - 1); //行列数减少一,进入新的行列式展开
}
int main()
{
int n;
double arr[20][20]; //存储行列式的值
int i = 0;
int j = 0;
scanf("%d", &n);
for (i = 0; i < n;i++)
for (j = 0; j < n; j++)
{
scanf("%d", &arr[i][j]);
}
double result = Getnum(arr, n); //获取行列式计算结果
printf("%.0f\n", result);
return 0;
}
?
?
二.全排列法
全排列法的实现思想也是递归,将各行不同列的元素实现所有的排序方式并进行计算相加,接下来也让我们来看看代码
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
int result = 0; //定义全局变量记录行列式的值
void Swap(int *a, int *b) //交换数值
{
int temp = *a;
*a = *b;
*b = temp;
}
int Mark(int No[],int n) // 判断行列式相乘的符号正负
{
int i = 0;
int j = 0;
int count = 0;
for (i = 0; i < n - 1;i++)
for (j = i+1; j < n; j++)
{
if (No[i] > No[j]) //按照相乘数列顺序不同列计算逆序数
{
count++;
}
}
if (count % 2)
{
return 1;
}
else
return 0;
}
void GetResult(int value[][20],int No[], int k, int n)
{
int sum = 1; //记录每次计算的值
if (k == n - 1)
{
for (int i = 0; i < n; i++)
{
sum *= value[i][No[i]]; //无论全排列下标的值如何,相乘数之间的列数肯定不同
}
if (Mark(No,n)) //获取符号正负
{
sum *= -1;
}
result += sum;
}
for (int i = k; i < n; i++) //将行列式下标值前n个值进行实现全排列
{
Swap(&No[k], &No[i]);
GetResult(value,No, k + 1, n);
Swap(&No[k], &No[i]);
}
}
int main()
{
int n;
printf("请输入阶数: ");
scanf("%d", &n); // 行列式阶数
int value[20][20]; // 存储行列式的值
int No[20]; // 记录行列式下标值
for (int i = 0; i < n; i++)
{
No[i] = i; //为行列式下标赋值
}
for (int i = 0; i < n; i++)
{
printf("请输入第%d的值", i + 1);
for (int j = 0; j < n; j++)
{
scanf("%d", &value[i][j]); //为行列式赋值
}
}
GetResult(value,No,0,n); //获取行列式的值
printf("行列式的值为:\n");
printf("%d\n ", result);
}
|