| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2469 人关注过本帖
标题:求行列式怎样编程实现。
只看楼主 加入收藏
qq349004853
Rank: 1
等 级:新手上路
帖 子:31
专家分:0
注 册:2008-3-27
收藏
 问题点数:0 回复次数:5 
求行列式怎样编程实现。
前些天,我贴了一篇关于两矩阵求积的程序,当然矩阵求积的程序实现还是很简单的,但这个程序也有个地方是值得新手学习的,这个程序储存矩阵元素用的不是二维数组,而是一维数组,这就解决了一个难题,那就是二维数组必须定义列边界,这样就只能储存程序员预先设定的矩阵,导致这个程序失去了通用性。当然现在我学到了一种更好的解决方法,那就是利用二级指针创建二维数组。其实在我贴出那个求积程序的时候,我就在想编一个程序求方阵的行列式,可是当时遇到了一点麻烦,但经过我的不懈努力,终于解决了。下面我就按着我的思维过程来描述一下这个过程,呵呵,大家不要嫌我啰嗦,因为我的目的并不仅仅是要大家看一下我的这个程序,而是要大家去思考一个问题,那也是我当时解决不了的一个问题。
    下面就是我的一个问题了,想一下如果要直接针对行列式计算的定义式去设计一算法,那将大大增加问题实现的难度。第一必须找出所有行上不在同一列元素的排列,然后把每一个排列中各个元素乘起来,再把所有的乘积加起来。可能是本人能力有限,我觉得找出所有排列在程序实现上很困难。而且还有一个难题就是每一个排列都对应着一个逆序数,这是用来判定这个排列的乘积最后是乘-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;
}
搜索更多相关主题的帖子: 行列式 
2008-11-16 18:39
ivapple
Rank: 1
等 级:新手上路
帖 子:46
专家分:0
注 册:2008-7-31
收藏
得分:0 
能不能用消元法搞成上三角后直接求值?
感觉这样效率会高些。
2008-11-17 01:26
ivapple
Rank: 1
等 级:新手上路
帖 子:46
专家分:0
注 册:2008-7-31
收藏
得分:0 
这个递归的效率是N!阶的
T(n)= n * T(n-1)
      = n * n-1 * T(n-2)
      = ......
      =n!
如果消元法可以的话只有N的三次方。
楼主的想法很值得学习。要是能把复杂度降下来就太好了!
2008-11-17 01:34
qq349004853
Rank: 1
等 级:新手上路
帖 子:31
专家分:0
注 册:2008-3-27
收藏
得分:0 
消元法,不错的想法,能不能说一下具体的实现方法啊?我很期待你的回答。
2008-11-18 18:56
miccing
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2008-11-27
收藏
得分:0 
行列式求值
我也在想编一个用消元法求行列式的值得程序,但是遇到了一点困难,希望大虾们帮我看看:
我的思路是:
#include "stdio.h"
#define N 3
main()
{
    int i,j,n,num,a[256][256],sum=1,temp;
    
    for(i=0;i<N;i++)                //输入行列式的每一项
        for(j=0;j<N;j++)
        {
            printf("NO.[%d][%d]:",i,j);
            scanf("%d",&a[i][j]);
        }
    
    for(i=0;i<N;i++)                //打印原始行列式
    {
        for(j=0;j<N;j++)
            printf("%d\t",a[i][j]);
            printf("\n");
    }
    for(n=0;n<N;n++)
    {
        for(i=n;i<N;i++)
        {
            if(a[i][n]!=0)
                break;
            else num=0;
        }
        if(num==0)
            break;
        while(!a[n][n])
            for(i=n;i<N;i++)
                for(j=n;j<N;j++)
                {
                    temp=a[n][j];
                    a[n][j]=a[i][j];
                    a[i][j]=temp;
                }
    
        for(i=n+1;i<N;i++)
            for(j=n;j<N;j++)
                a[i][j]+=-a[n][j]*(a[i][n]/a[n][n]);
    }
    printf("\n\n\n");
    for(i=0;i<N;i++)
    {
        for(j=0;j<N;j++)
            printf("%d\t",a[i][j]);
            printf("\n");
    }
    printf("\n\n\n");
    for(i=0;i<N;i++)
        sum*=a[i][i];
    printf("sum=%d\n",sum);



}
2008-11-27 20:33
miccing
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2008-11-27
收藏
得分:0 
我的邮箱是375421026@,期望你的回答!
2008-11-27 20:34
快速回复:求行列式怎样编程实现。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.039569 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved