四阶代数余子式怎么求_老笔记整理五:C实现10阶内通过展开代数余子式求行列式的值...

这个分为两部分,先是写出了C实现计算三阶行列式,然后过了一段时间突然有了思路才写下了10阶内这段代码。真怀念那段写代码的日子。

一:C实现计算三阶行列式

最近高数课在上线性代数,二阶的还能口算,三阶的有点麻烦,想陆陆续续地把公式都用C来实现。

因为二阶的行列式如果用C来写就是一句话:val=det[0][0]*det[1][1]-det[0][1]*det[1][0];

太简单了这里就不写了,主要写关于三阶的。只要把这个三阶行列式里每一个元素打进去就能算出值来了。

过两天再写余子式的展开。

1 #include

2

3 voidmain()

4 {

5 int det[3][3]={0};

6 inti,j,k;

7 int det_val=0,det_tval=1;

8

9 /*------------------- det Input Start -----------------------------------*/

10 for(i=0;i<3;i++)

11 {

12 printf("Give me the row%d (by space): ",i+1);

13 for(j=0;j<3;j++)

14 scanf("%d",&det[i][j]);

15 }

16 /*------------------- det Input End -------------------------------------*/

17

18

19

20 /*------------------- det Calculate Start -------------------------------*/

21 for(i=0;i<3;i++)

22 {

23 k=i;

24 for(j=0;j<3;k++,j++)// left-up to right-down

25 {

26 if(k==3) k=0;

27 det_tval*=det[k][j];

28 }

29

30 det_val+=det_tval;

31 det_tval=1;

32 }

33

34 for(i=0;i<3;i++)

35 {

36 k=i;

37 for(j=3-1;j>=0;k++,j--)// right-up to left-down

38 {

39 if(k==3)k=0;

40 det_tval*=det[k][j];

41 }

42

43 det_val-=det_tval;

44 det_tval=1;

45 }

46

47 /*------------------- det Calculate End --------------------------*/

48

49

50 /*------------------- Show det Start ------------------------------------*/

51 printf("\n");

52 for(i=0;i<3;i++)

53 {

54 for(j=0;j<3;j++)

55 printf("%5d",det[i][j]);

56 printf("\n");

57 }

58 /*------------------- Show det End --------------------------------------*/

59 printf("\n\nval=%d\n",det_val);

60 }

二:C实现10阶内通过展开代数余子式求行列式的值

最近越来越忙了,这个问题已经想了有一段时间了。之前发过一篇计算二阶与三阶行列式值的文章,但哪些方法只能解二阶与三阶行列式的值。如果想求高阶的行列式,必需通过代数余子式展开才行。虽然网上看到过有关代码,但我不想细看。还是自己写出来的有成就感。这两个礼拜日思夜想,终找到其规律。

这段代码可以求最高十阶的行列式的值,当然是通过展开代数余子式的方式。这里的关键在于,拿四阶来举例。四阶的行列式展开后是某 行的四个元素分别乘以他们各自的余子式,而每个余子式又继续按照这种样子继续,这是典型的迭代算法。因此我把求余子式的过程写成了一个函数。直到迭代到余子式为二阶行列式时我们再用二阶行列式办法去做。但这还不是这道题的难点。难点在于经过不定次数的迭代后,必定会有个二阶的余子式,这个二阶余子式的几个元素并不是相邻的。如何找对这四个元素才是本题最大的难点。

废话不多说了,上代码,欢迎各位高手来指点。

1 #include

2 #define max 10

3

4 void show_minor(int start,int end,intdet[max][max]);

5

6 voidmain()

7 {

8 int det[10][10]={0};

9 int i,j,k,n=0;

10 int *dot=det;

11 int det_val=0,det_tval=1;

12

13 do{

14 printf("Give me the Order Number between 1 to 9:");

15 scanf("%d",&n);

16 }while(n<0||n>9);

17

18 for(i=1;i<=n;i++)

19 {

20 printf("Give me the row%d (by space): ",i);

21 for(j=1;j<=n;j++)

22 scanf("%d",&det[i][j]);

23 }

24

25 det[0][0]=n;

26

27 for(i=n+1;i

28 det[0][i]=det[i][0]=1;

29

30

31 det_val=Minor_In(n,dot);

32

33 printf("\n");

34 show_minor(1,n,dot);

35

36 printf("\n\nval=%d\n",det_val);

37 }

38

39

40 void show_minor(int start,int end,intdet[max][max])

41 {

42 inti,j;

43 for(i=start;i<=end;i++)

44 {

45 for(j=start;j<=end;j++)

46 printf("%5d",det[i][j]);

47 printf("\n");

48 }

49

50 }

51 intfut2(num){

52 return 1-num%2*2;

53 }

54

55 int Minor_In(int msize,intdet[max][max])

56 {

57

58 int i,j,k=1,Mvalue=0,l=1;

59 int *md=det;

60 int m00=1,m01=1,m10=1,m11=1;

61

62 if(msize==2)

63 {

64 for(i=1;i<=det[0][0];i++)

65 for(j=1;j<=det[0][0];j++)

66 if(!det[i][0] && !det[0][j])

67 {

68 switch(k)

69 {

70 case 1:

71 m00=det[i][j];break;

72 case 2:

73 m01=det[i][j];break;

74 case 3:

75 m10=det[i][j];break;

76 case 4:

77 m11=det[i][j];break;

78 default:break;

79 };

80 k++;

81 }

82 Mvalue=m00*m11-m01*m10;

83 }

84 else

85 {

86 k=det[0][0]-msize+1;

87 det[k][0]=1;

88

89 for(i=1;i<=det[0][0];i++)

90 {

91 if(!det[0][i])

92 {

93 det[0][i]=1;l*=-1;

94 Mvalue+=det[k][i]*l*Minor_In(msize-1,md);

95 det[0][i]=0;

96 }

97 }

98 det[k][0]=0;

99 }

100 returnMvalue;

101 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值