计算行列式

xiaoxiao2021-02-28  30

功能:输入任意阶数的行列式,输出结果

思考:

1)如何自动判断行列式的阶数?

  第一行以字符串形式输入,便于控制结束。阶数通过第一行的空格数判断(最后一个数字后的'\0'转化为空格)。第一行由字符串通过atof()转换成浮点型输入第一行,后 n-1 行直接输入。                                               

2)如何计算行列式

  利用递归不断计算余子式

//行列式计算 #include <stdio.h> #include <stdlib.h> double count(double D[][100],int n); int main(void) { double D[100][100]={}; int n=0, i, j=0, num=0;//D为行列式,n为行列号,num为位(包括数、符号和小数点) char a[100], digit[10]={}; printf("Input D.\n"); // 通过输入第一行(当作字符串)来判断行列数n gets(a); // 判断每个字符,到回车跳出 for (i=0; a[i] != '\0'; i++) { // 如果此字符是数字 if ((a[i]>='0' && a[i]<='9') || a[i]=='-' || a[i]=='.') { digit[num] = a[i]; num++;//这个数的位加一 // 防止不运行最后一个数 if (a[i+1] == '\0') { a[i+1] = ' '; a[i+2] = '\0'; } } // 空格处算出这个数 else if (a[i] == ' ') { D[0][n] = atof(digit); n++; // 初始化位数num和digit[] for (j=0; j<num; j++) { digit[j] = '\0'; } num = 0; } } // 后 n-1 行直接输入 for (i=1; i<n; i++) { for (j=0; j<n; j++) { scanf("%lf",&D[i][j]); } } printf("|D| = %.2lf\n",count(D, n)); return 0; } //利用第一列展开求行列式 double count(double D[][100],int n) { int i,p,q,s;//i为原行列式行数,p、q为余子式的行列号,s为符号表示 double M[100][100] = {}, result = 0.0;//M[][]为余子式,result为结果 // 令拆到行列数为0时,余子式为1 if (n==0) { return 1; } // 第一列展开 for (i=0,s=1; i<n; i++,s*=(-1)) { // 求a[i][0]的余子式M[i][0],即删去第i+1行第1列 for (p=0; p<n-1; p++) { if (p<i) { for (q=0; q<n-1; q++) { M[p][q] = D[p][q+1]; } } else if (p>=i) { for (q=0; q<n-1; q++) { M[p][q] = D[p+1][q+1]; } } } // 利用递归求解 result += s*D[i][0]*count(M, n-1); } return result; }

 

                  

 

转载请注明原文地址: https://www.6miu.com/read-2625064.html

最新回复(0)