花了半天时间,写了这个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. WinMain与WndProc以及窗口诞生过程总结

    一.int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLine, int nCmdShow) 四个 ...

  2. Asp.net core与golang web简单对比测试

    最近因为工作需要接触了go语言,又恰好asp.net core发布RC2,就想简单做个对比测试. 下面是测试环境: CPU:E3-1230 v2 内存:16G 电脑有点不给力 操作系统:Centos7 ...

  3. 『安全工具』Nmap 强悍的端口扫描工具

    作为时下流行的端口扫描工具,Nmap有因其扫描的隐密性有“端口扫描之王”之称 上图是黑客帝国(The Matrix)中崔妮蒂用Nmap入侵核发电站的能源管理系统 0x 01 Nmap介绍 Nmap是一 ...

  4. Windows 系统版本判断

    Windows 系统版本判断 博客分类: C/C++   很多情况下,需要软件判断操作系统,其实网上写的都很少,我希望这篇文章能给大家帮助 首先我们要在.h中定义下面的东西 #define PRODU ...

  5. Android中的测试类配置AndroidManifest.xml

    测试类至于要把一个类继承ActivityTestCase即可至于方法,根据需要自己建立方法:之后必须配置AnroidMainfest.xml文件 配置AndroidManifest.xml文件 1) ...

  6. Codeforce 222 div1

    A 假设只有一个连通块,任选一个点入队,按bfs/dfs序删除即可. trick: 要考虑有多个连通块的情况,不一定无解. #define rep(i,n) for(int i=0 ; i<(n ...

  7. C++ deepin

    访问类成员函数(cin.getline())方式是从访问结构成员变量方式衍生而来; C++结构体变量申明 struct关键字可省略; c++结构体变量声明初始化, = 可省略;但此需用在c++,大家都 ...

  8. IntelliJ IDEA创建web项目及异常问题解决

    IDEA配置Tomcat: 1.下载Tomcat,本次使用的是apache-tomcat-6.0.43 2.IDEA配置Tomcat 在idea中的Settings(Ctrl+Alt+s)(或者点击图 ...

  9. DB2完美卸载

    会安装,也要会卸载.详细的安装说明不多,我这个我觉得写得还算全.  准备工作.      1.用 ps -ef|grep db2 找出db2安装目录      2. ./db2level 查出DB2的 ...

  10. Objective-C基础学习笔记——对象初始化

    obj中创建新对象有两种方式:[classname new]和[[classname alloc] init].两种方法等价,Cocoa惯例是使用alloc和init. 1.分配对象: allocat ...