标签:
题目: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;
代码:
#include<bits/stdc++.h>
#define MAXN 10
#define MAX 100000000
#define ll long long
using namespace std;
int b[MAXN][MAXN]; //***存储伴随矩阵
//***递归求n*n阶行列式的值
int matrix(int n, int a1[MAXN][MAXN])
{
int b[10][10], sum=0; //****b保存当前n*n阶行列式a的余子式
if(n==1) return a1[0][0]; //****n为1时结束递归
for(int i=0; i<n; i++) //****通过循环求出当前行列式a[1][0]~a[1][n-1]的所有余子式
{
for(int j=0; j<n-1; j++)
{
int column=0;
for(int k=0; k<n; k++)
{
if(k==i) continue;
b[j][column++]=a1[j+1][k]; //**将a[0][i]的余子式保存到b数组中
}
}
int flag=1;
if(i&1) flag=-1;
sum+=flag*a1[0][i]*matrix(n-1, b);
}
return sum;
}
//***求矩阵a的伴随矩阵
void adjoint_matrix(int n, int a[MAXN][MAXN])
{
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
int a1[MAXN][MAXN], row=0;
for(int k=0; k<n; k++) //****将a[i][j]的余子式存储到a1数组中;
{
int column=0;
if(k==i) continue;
for(int l=0; l<n; l++)
{
if(l==j) continue;
a1[row][column++]=a[k][l];
}
row++;
}
b[j][i]=pow(-1, i+j)*matrix(n-1, a1); //****b中存储b[i][j]的算数余子式转置后的矩阵即求得伴随矩阵
}
}
}
void print(int n, int ans)
{
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
if(b[i][j]%ans==0)
{
cout << b[i][j]/ans << " ";
}
else //******不能整除的话输出最简分式形式
{
int cnt=__gcd(b[i][j], ans);
int x=b[i][j]/cnt, y=ans/cnt;
if(y<0)
{
cout << (-1*x) << "/" << (-1*y) << " ";
}
else
{
cout << x << "/" << y << " ";
}
}
}
cout << endl;
}
}
int main(void)
{
std::ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
int n;
while(cin >> n)
{
int a[MAXN][MAXN];
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
cin >> a[i][j];
}
}
int ans=matrix(n, a);
if(!ans) //*******矩阵值为0即不存在逆矩阵
{
cout << "The input data is error!" << endl;
continue;
}
adjoint_matrix(n, a);
print(n, ans);
}
return 0;
}
标签:
原文地址:http://www.cnblogs.com/geloutingyu/p/5893770.html