求行列式怎样编程实现。
前些天,我贴了一篇关于两矩阵求积的程序,当然矩阵求积的程序实现还是很简单的,但这个程序也有个地方是值得新手学习的,这个程序储存矩阵元素用的不是二维数组,而是一维数组,这就解决了一个难题,那就是二维数组必须定义列边界,这样就只能储存程序员预先设定的矩阵,导致这个程序失去了通用性。当然现在我学到了一种更好的解决方法,那就是利用二级指针创建二维数组。其实在我贴出那个求积程序的时候,我就在想编一个程序求方阵的行列式,可是当时遇到了一点麻烦,但经过我的不懈努力,终于解决了。下面我就按着我的思维过程来描述一下这个过程,呵呵,大家不要嫌我啰嗦,因为我的目的并不仅仅是要大家看一下我的这个程序,而是要大家去思考一个问题,那也是我当时解决不了的一个问题。下面就是我的一个问题了,想一下如果要直接针对行列式计算的定义式去设计一算法,那将大大增加问题实现的难度。第一必须找出所有行上不在同一列元素的排列,然后把每一个排列中各个元素乘起来,再把所有的乘积加起来。可能是本人能力有限,我觉得找出所有排列在程序实现上很困难。而且还有一个难题就是每一个排列都对应着一个逆序数,这是用来判定这个排列的乘积最后是乘-1还是1的条件,所以肯定得每找出一个排列的同时求出它的逆序数,这样才能一一对应起来,我觉得真是难上加难。当然我解决不了,可能是个人能力不够。如果有人认真看了这个帖子,而且你有好的解决方法,希望你贴出来,当然没有好的解决方法,如果你有好的思路亦可以说出来,大家讨论一下,看能不能实现。有时思路就决定了出路。
其实逛这个论坛目的就是为了学习和交流。学习就不能只是看别人的帖子,更重要的是思考,因为任何东西只有经过了自己的思考才能算自己的,否则一切都是白扯。当然交流就不用我说了,其实我引出这个话题并不是要大家舍本逐末,有容易的干嘛还要去用难的,因为我们的目的并不仅仅就是解决这一问题,而是学习,我想不管是谁,如果真的用心去探索这个问题,一定会学到很多东西的,而且钻的越深,学到的东西就越多。
下面我就来描述一下我编的这个程序。
问题:用c语言编一程序,求任一方阵的行列式,方阵阶数由用户从键盘输入。
算法:用函数递归调用实现行列式按第一列展开求值。
特点:
一:此程序使用二级指针来创建二维数组,可以免去一个麻烦,那就是我前面说的直接定义二维数组必须定义数组的列边界,使得方阵的阶数不能由用户自定义,只能由程序员预先设定,使得程序失去通用性。
二:程序采用函数递归调用的方法来计算行列式,大大降低了程序的复杂性,使问题的解决变得更简单。
#include<iostream.h>
int qiuzhi(int n,int **a)
{
int i=0, j=0, c=0;
int **b;
b=new int*[n];
for(i=0;i<n;i++)
b[i]=new int[n];
int p=0, q=0;
int sum=0;
if(n == 1)
return a[0][0];
for(i=0;i<n;i++)
{
for(c=0;c<n-1;c++)
{
if(c<i)
p=0;
else
p=1;
for(j=0;j<n-1;j++)
{
b[c][j]=a[c+p][j+1];
}
}
if(i%2==0) q=1;
else q=(-1);
sum=sum+a[i][0]*q*qiuzhi(n-1,b);
}
return sum;
for(i=0;i<n;i++)
delete b[i];
delete b;
}
void main()
{ int n;
int rezult;
int **x;
cout<<"请输入所求行列式阶数:";
cin>>n;
x=new int*[n];
for(int i=0;i<n;i++)
x[i]=new int[n];
cout<<"请依次输入方阵的各个元素:";
for(i=0;i<n;i++)
for(int j=0;j<n;j++)
cin>>x[i][j];
rezult=qiuzhi(n,x);
cout<<"所求方阵的行列式是:"<<rezult<<endl;
for(i=0;i<n;i++)
delete x[i];
delete x;
}