这个分为两部分,先是写出了C实现计算三阶行列式,然后过了一段时间突然有了思路才写下了10阶内这段代码。真怀念那段写代码的日子。
一:C实现计算三阶行列式
最近高数课在上线性代数,二阶的还能口算,三阶的有点麻烦,想陆陆续续地把公式都用C来实现。
因为二阶的行列式如果用C来写就是一句话:val=det[0][0]*det[1][1]-det[0][1]*det[1][0];
太简单了这里就不写了,主要写关于三阶的。只要把这个三阶行列式里每一个元素打进去就能算出值来了。
过两天再写余子式的展开。
1 #include <stdio.h> 2 3 void main() 4 { 5 int det[3][3]={0}; 6 int i,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 <stdio.h> 2 #define max 10 3 4 void show_minor(int start,int end,int det[max][max]); 5 6 void main() 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<max;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,int det[max][max]) 41 { 42 int i,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 int fut2(num){ 52 return 1-num%2*2; 53 } 54 55 int Minor_In(int msize,int det[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 return Mvalue; 101 }
时间: 2024-10-01 20:55:51