C++与线性代数(一)实现行列式的计算

前言

这次给大家带来如何用c++编写行列式的方法,之后会出后续的线性代数的相关知识

前提知识点

逆序:

一个排列中,如果一个大的数排在一个小的数前面 【如 5,2】,就称这两个数构成一个逆序.

逆序数:

一个排列逆序数的总数称为这个排列的逆序数
如(5,4,2,3,1 )的逆序数为 n = 4+3+1+1= 9
(1,4,2,3,5 )的逆序数为 n = 0+2+0+0= 2
逆序数为奇数称排列为奇排列,逆序数为偶数称排列为偶排列

行列式

这里小编为了方便叙述给个粗略的定义:不同行不同列的数相乘的和。
在这里插入图片描述
其中 t 为排列的逆序数

分析

1、需要全排列作为支撑,排列的数字为p1 、p2 …pn

(1)、用c++自带函数库方法

#include
 //a 为需要排列的数组,n
 do{
  	    for (int i = 0; i < n; i++){
  	      cout<<a[i];
  	    }  // 打印 
		cout<<endl;
	}while (next_permutation(a, a + n));                          

(2)、用递归的方法自己写

2、计算逆序数
int inverseNumber(int *p,int len){

   int count = 0;

   for (int i = 0; i < len; ++i)
    {
    	for (int j = i+1; j < len; ++j)
    	{
    		if (p[i]>p[j])
    		{
    		    count++;
    		}
    	}
    } 
   
   if (count%2==0)
    {
    	return 1;
    }else{
       return -1; 	
    } 
   
}                          
3、作和

注意 a[i]-1 是因为数组从0开始排序,这里很容易记错,全排列那里因为是从1开始排序的

int result(int **p,int n){
  

  int a[n];
  int count = 1; //结果
  int r = 0;
//初始化系数
  for (int i = 0; i < n; i++)
  {
  	a[i] = i+1;
  }
   
  do{
  	 
  	    for (int i = 0; i < n; i++){
  	      count*=p[i][a[i]-1];
  	    }  // 打印 
		 r+=inverseNumber(a,n)*count;
		 count = 1;

	}while (next_permutation(a, a + n));


  return r;
}

整体代码(拿去吧,我知道你们都是不看内在的人)

#include
#include
using namespace std;

//求逆序数
int inverseNumber(int *p,int len){

   int count = 0;

   for (int i = 0; i < len; ++i)
    {
    	for (int j = i+1; j < len; ++j)
    	{
    		if (p[i]>p[j])
    		{
    		    count++;
    		}
    	}
    } 
   
   if (count%2==0)
    {
    	return 1;
    }else{
       return -1; 	
    } 
   
}

//求和函数
int result(int **p,int n){
  

  int a[n];
  int count = 1; //结果
  int r = 0;
//初始化系数
  for (int i = 0; i < n; i++)
  {
  	a[i] = i+1;
  }
   
  do{
  	 
  	    for (int i = 0; i < n; i++){
  	      count*=p[i][a[i]-1];
  	    }  // 打印 
		 r+=inverseNumber(a,n)*count;
		 count = 1;

	}while (next_permutation(a, a + n));


  return r;
}


int main(){

//定义行列式
int n; //行列式的阶
cout<<"输入行列式的阶"<<endl;
cin >> n;
int** arr = new int*[n]; //定义指针数组,用于传递到函数之中
for (int i = 0; i < n; ++i)
{
  arr[i] = new int[n];
  	for (int j = 0; j < n; ++j)
	{
		cin>>arr[i][j];
	}
}

cout<<result(arr,n)<<endl;

return 0;
}

                       

你可能感兴趣的:(c语言与算法)