花了半天时间,写了这个n阶行列式计算的程序,应该算是比较优美吧,有很多地方多次做了优化,程序占用内存不是很大,要是说小吧,也不合适,因为里边有一个递归,而且递归的深度还比较深。时间复杂度具体没有细看,应该不会太大。
看我的程序运行的截图:

ok,先看程序。
  C  Code 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
 
 
#include <malloc.h>
#include <stdio.h>
#include <stdlib.h>//包含的头文件不解释
typedef bool int //因为标准c里边没有bool类型才这么做
#define false 0
#define true 1 
                                  //定义几个全局变量,无奈之举
int * c,                       //将整个行列式的值存到c指向的空间里
      n = ,                  //记录当前的行列式计算进行了多少步
      a,                         //方便传递行列式的阶数
      sum = ;             //记录每一步行列式计算所累加的结果
int aq(int a)              //计算阶乘的函数,就不多解释了
{
    ;
    ; i <= a; i ++)
          s *= i;
    return s;
}
void swap(int * a, int * b)//利用地址传递,交换两个数的值
{
    int m =* a;
    * a = * b;
    *b = m;
}
bool sa(int * l)//计算在行列式计算过程中每一项前边的符号是正还是负
{
    ;//n为行列式展开式每一项的逆序数
    ; i < a-; i ++)
         ; j < a; j++)
               if(l[i]>l[j])n++;//不断通过条件判断累加逆序数得出最终的逆序数
    ) return false;//若为正,则返回false
    return true;//否则返回true
}
void perm(int * l,int k,int m)//整个程序里边的核心函数,找出在不同行不同列的所有组合
{
    ;
    if(k > m)
    {
        n++;//每递归回来一次,将记录运行次数加一
        ; j < a; j ++)
              s *= c[ l[ j ] + a * j ];//算出此次行列式展开式的这项的值
        ;//确定这一项的符号
        //输出当前sum内的值(即到当前为止所得到的结果是多少)
        //输出运行的完成程度(即当前运行的次数除以总次数) 
        printf(.1 ) * 10 );
    }
    else  //不断的向内递归,就不多解释了,因为很多大公司招聘的时候,全排列问题在笔试环节是必出题,百度里有很多解释
    {
        for(i = k; i <= m; i++)
        {
            swap(l + k, l + i);
            perm(l, k + , m);
            swap(l + k, l + i);
        }
    }
}
void main()//主函数
{
    int * b,//一个辅助变量,在递归函数中将b指向的空间内的值进行全排列,也即行列式展开式不同组合的下标
    i, //循环中的辅助变量
    f, //在格式化输出行列式的辅助变量
    e;//判断是否退出程序的标志位
    system("color 3e");//设置程序运行的前景色和背景色
u: system("cls");//清空屏幕
    printf("请输入行列式的阶数:\n");
    scanf("%d", &a);//获取行列式的阶数
    b = ( int * ) malloc ( sizeof ( int ) * a );//为变量申请空间
    c = ( int * ) malloc ( sizeof ( int ) * a * a );
    ; i < a; i++)
         * ( b + i ) = i;//为辅助变量也即行列式下标逐个赋值
    ; i < a * a; i++)
    {
        if( i % a == 0 )
            printf("请依次输入行列式中第%d行的值(以空格分隔):\n",i / a + 1 );//提示输入行列式的值
        scanf("%d", c + i );
    }
    printf("\n\n");
    perm( b, , a - 1 );//计算行列式的值
    printf("\n行列式展开式共有%d项\n", aq( a ) );//打印出来行列式的各种信息
    ;//判断当前的行列式是偶数行还是奇数行
        else f = a;
    ; i < a * a; i ++ )
    {       
        ) //判断是否达到行列式中间的一行行首
            printf("D = ");//输出“D = ”
        ) //判断是否是每一行的行首,若是则输出四个空格,保证输出的格式优美
                    printf("    ");
        ) //判断是否是行首,若是输出制表符竖线,可与上一句写到一块儿
            printf("┃");
        ) //判断是否是行列式某一行的最后一个数
            printf("%2d", * ( c + i ) );
        else printf("%2d ", * ( c + i ) );//若不是行列式某一行的最后一个数则在数字后边加一个空格
        if ( ( i + 1 ) % a == 0 ) //判断是否到达一行的行末
            printf("┃");
        ) //判断是否达到行列式中间一行的行末,输出整个行列式的值
            printf(" = %d\n",sum);
        else if ( ( i + 1 ) % a == 0 ) //判断是否到达行末输出换行
                    printf("\n");
    }
    printf("\n\n");
    printf("是否继续?( 1 / 0 )\n");//提示是否退出
    scanf("%d", &e);
    n = 0;//每次都将都将上一次的运行记录消除
    if( e ==1 ) goto u;//判断是否推出
    else if ( e == 0 ) exit( 0 );
}

过了很久之后,加了一些注释,若是各位看官还有不清楚的请百度去,或者直接问我,愿意解答。
里边还有好多地方可以调整,若有更好的调整方法,请联系我,不胜感激。 

n阶行列式计算----c语言实现(完结)的更多相关文章

  1. n阶行列式计算

    1.化为上下三角 该类型的矩阵.行列式在之前写过(https://www.cnblogs.com/wangzheming35/p/12906624.html),也建议记住这个行列式的结论. 当然不仅仅 ...

  2. C#程序计算N阶行列式的值及N元一次方程组

    C#程序计算N阶行列式的值及N元一次方程组 用了挺长时间自行完成了C#程序计算N阶行列式的值及N元一次方程组.由于自己没有在网上查阅其他资料,所以只能硬着头皮用最朴素的思想和基础的算法进行编程.在给出 ...

  3. MyMathLib系列(行列式计算)

    靠人不如靠己,准备做自己得MathLib,在学校的时候,就想过把数学数理的东西都计算机化.但一直没有时间去做这件事情,如今认为空余 时间比較闲,就做做这件事情,先从线性代数開始,毕竟这里面的非常多算法 ...

  4. MyMathLib系列(行列式计算2)

    /// <summary> /// 行列式计算,本程序属于MyMathLib的一部分.欢迎使用,參考,提意见. /// 有时间用函数语言改写,做自己得MathLib,里面的算法经过验证,但 ...

  5. 基于上三角变换或基于DFS的行(列)展开的n阶行列式求值算法分析及性能评估

    进入大一新学期,看完<线性代数>前几节后,笔者有了用计算机实现行列式运算的想法.这样做的目的,一是巩固自己对相关概念的理解,二是通过独立设计算法练手,三是希望通过图表直观地展现涉及的两种算 ...

  6. 线代: N阶行列式

    线性变换 将 (x, y) 变成 (2 x + y, x - 3 y) 就叫做线性变换, 这就是矩阵乘法, 用于表示一切线性变换. 几何上看, 把平面上的每个点 (x, y) 都变到 (2 x + y ...

  7. TOJ4537: n阶行列式

    4537: n阶行列式  Time Limit(Common/Java):1000MS/3000MS     Memory Limit:65536KByteTotal Submit: 28       ...

  8. 行列式计算(C#)

    最近几天学习高等代数老师说要写个程序算行列式的结果,闲来无事就简单写了一下. 不多说了,上代码 using System; using System.Collections.Generic; usin ...

  9. 行列式(三):n阶行列式

    1.数学定义   n阶行列式定义如下: 2.算法实现 函数名: GetValue() 功能:返回一个行列式的值 Private Function GetValue() Dim gValue As Do ...

随机推荐

  1. office2003万能密钥

    保证有效 OFFICE 2003 :  GWH28-DGCMP-P6RC4-6J4MT-3HFDY

  2. iOS7——图像资源Images Assets

    iOS7初体验(3)——图像资源Images Assets 分类: iOS开发2013-06-18 16:02 17583人阅读 评论(2) 收藏 举报 ios7Images xcassets图像资源 ...

  3. Grunt Server:Fatal error: Port 35729 is already in use by another process.

    提示35729端口被占用,使用lsof命令进行查看: y@y:yo-test$ lsof -i : COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME ...

  4. SQLiteDatabase中的事务

    beginTransaction():开始事务endTransaction():结束事务SQLiteDatabase还提供了如下方法来判断当前上下文是否处于事物环境中.inTransaction(): ...

  5. 如何禁止KEIL初始化RAM为零& 如何判断是软复位还是上电复位

    (1)如何禁止KEIL初始化RAM为零? 1. 在KEIL Noinit 打钩 2. <1> 另须对需要热启动保持的变量用 _at_ 关键字指定某个区域,否则还是没用 <2>或 ...

  6. Linux系统编程(30)—— socket编程之TCP/IP协议

    在世界上各地,各种各样的电脑运行着各自不同的操作系统为大家服务,这些电脑在表达同一种信息的时候所使用的方法是千差万别.就好像圣经中上帝打乱了各地人的口音,让他们无法合作一样.计算机使用者意识到,计算机 ...

  7. 【android】adb连接几个常见问题(遇到再新增)

    不知道为什么,每次连接手机,都提示 adb server is out of date,偶尔也会提示not found 每次去百度,都好多方法---终于有一种方法非常靠谱,遂,记录之--- 问题一:o ...

  8. 使用定制的ArrayAdapter制作ListView的Items(翻译)

    Translated by:AcerWang    原文出自:customizing-android-listview-items-with-custom-arrayadapter  背景介绍 对于现 ...

  9. 基于HTML5 Canvas的饼状图表实现教程

    昨天我们分享了一款基于HTML5的线性图表应用,效果非常不错,可以看在线DEMO或者实现教程.今天我们继续来分享一款基于HTML5的网页图表,它也是利用Canvas绘制的,但是和前面不同的是,这款图表 ...

  10. HDU_2045——RPG问题,递推

    Problem Description 人称“AC女之杀手”的超级偶像LELE最近忽然玩起了深沉,这可急坏了众多“Cole”(LELE的粉丝,即"可乐"),经过多方打探,某资深Co ...