题目:noyj774
用代数余子式求逆矩阵方法:
若现有矩阵A,要求其逆矩阵;
若|A|==0,则其不存在逆矩阵;
若|A|!=0,其逆矩阵A^-1==*A/|A|;其中*A为其伴随矩阵;
伴随矩阵的求法:
*A[j][i]==|M[i][j]|,其中M[i][j]为A[i][j]的代数余子式;
即*A1[i][j]==|M[i][j]|,再将*A1转置得到*A;
代码:
1 #include<bits/stdc++.h> 2 #define MAXN 10 3 #define MAX 100000000 4 #define ll long long 5 using namespace std; 6 7 int b[MAXN][MAXN]; //***存储伴随矩阵 8 9 //***递归求n*n阶行列式的值 10 int matrix(int n, int a1[MAXN][MAXN]) 11 { 12 int b[10][10], sum=0; //****b保存当前n*n阶行列式a的余子式 13 if(n==1) return a1[0][0]; //****n为1时结束递归 14 for(int i=0; i<n; i++) //****通过循环求出当前行列式a[1][0]~a[1][n-1]的所有余子式 15 { 16 for(int j=0; j<n-1; j++) 17 { 18 int column=0; 19 for(int k=0; k<n; k++) 20 { 21 if(k==i) continue; 22 b[j][column++]=a1[j+1][k]; //**将a[0][i]的余子式保存到b数组中 23 } 24 } 25 int flag=1; 26 if(i&1) flag=-1; 27 sum+=flag*a1[0][i]*matrix(n-1, b); 28 } 29 return sum; 30 } 31 32 //***求矩阵a的伴随矩阵 33 void adjoint_matrix(int n, int a[MAXN][MAXN]) 34 { 35 for(int i=0; i<n; i++) 36 { 37 for(int j=0; j<n; j++) 38 { 39 int a1[MAXN][MAXN], row=0; 40 for(int k=0; k<n; k++) //****将a[i][j]的余子式存储到a1数组中; 41 { 42 int column=0; 43 if(k==i) continue; 44 for(int l=0; l<n; l++) 45 { 46 if(l==j) continue; 47 a1[row][column++]=a[k][l]; 48 } 49 row++; 50 } 51 b[j][i]=pow(-1, i+j)*matrix(n-1, a1); //****b中存储b[i][j]的算数余子式转置后的矩阵即求得伴随矩阵 52 } 53 } 54 } 55 56 void print(int n, int ans) 57 { 58 for(int i=0; i<n; i++) 59 { 60 for(int j=0; j<n; j++) 61 { 62 if(b[i][j]%ans==0) 63 { 64 cout << b[i][j]/ans << " "; 65 } 66 else //******不能整除的话输出最简分式形式 67 { 68 int cnt=__gcd(b[i][j], ans); 69 int x=b[i][j]/cnt, y=ans/cnt; 70 if(y<0) 71 { 72 cout << (-1*x) << "/" << (-1*y) << " "; 73 } 74 else 75 { 76 cout << x << "/" << y << " "; 77 } 78 } 79 } 80 cout << endl; 81 } 82 } 83 84 int main(void) 85 { 86 std::ios::sync_with_stdio(false), cin.tie(0), cout.tie(0); 87 int n; 88 while(cin >> n) 89 { 90 int a[MAXN][MAXN]; 91 for(int i=0; i<n; i++) 92 { 93 for(int j=0; j<n; j++) 94 { 95 cin >> a[i][j]; 96 } 97 } 98 int ans=matrix(n, a); 99 if(!ans) //*******矩阵值为0即不存在逆矩阵 100 { 101 cout << "The input data is error!" << endl; 102 continue; 103 } 104 adjoint_matrix(n, a); 105 print(n, ans); 106 } 107 return 0; 108 }