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


    这个分为两部分,先是写出了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("
    ");
    52     for(i=0;i<3;i++)
    53     {
    54         for(j=0;j<3;j++)
    55             printf("%5d",det[i][j]);
    56         printf("
    ");
    57     }
    58 /*------------------- Show det End --------------------------------------*/
    59     printf("
    
    val=%d
    ",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("
    ");
     34     show_minor(1,n,dot);
     35 
     36     printf("
    
    val=%d
    ",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("
    ");
     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 }
  • 相关阅读:
    代码题(22)— 二叉树镜像、相同的树 、对称二叉树
    代码题(26)— 不同路径
    代码题(25)— 最大子序和、最长上升子序列
    Linux 基本命令总结
    C++(五)— 控制保留小数位数
    C++(四)— 字符串、数字翻转3种方法
    代码题(24)— 寻找重复数、数组中重复的数据、找到所有数组中消失的数字
    代码题(23)— 数组中的最长山脉
    【vue】vue +element 搭建项目,将js函数变成vue的函数
    【vue】vue +element 搭建项目,$createElement使用
  • 原文地址:https://www.cnblogs.com/shining77/p/7134243.html
Copyright © 2020-2023  润新知