#include<bits/stdc++.h>
using namespace std;
int n,false_1=-1;
double det(int n, double *Mat)//递归求行列式
{
if (n==1)
return Mat[0];
else
{
double *subMat = new double[(n-1)*(n-1)];
int cnt=0;
double sum=0.0;
for (int i=0;i<n;i++) //i对应为原矩阵的阶数 此处特指行数(取第一列元素的代数余子式)
{
for (int subrow=0;subrow<n-1;subrow++)
{
cnt=(subrow<i?0:1); //如果代数余子式的行<原矩阵的行 则同行赋值 若≥ 则下一行赋值 即行数+1
for (int subcol=0;subcol<n-1;subcol++)
{
subMat[subrow*(n-1)+subcol] = Mat[(subrow+cnt)*n+subcol+1];//将原矩阵元素赋给代数余子式
}
}
int sign=(i%2==0?1:-1);//经计算n*row元素的系数 和row%2有关
sum +=sign*Mat[i*n]*det(n-1,subMat);//a1i*A1i
}
delete[]subMat;
return sum;
}
}
double cofactor(int row,int col,double *mat,int n)//求伴随矩阵中的元素(余子式)
{
double *cofactor1=new double[(n-1)*(n-1)];
for(int i=0;i<n-1;i++)
{
int temp1=(i<row?0:1);
for(int j=0;j<n-1;j++)
{
int temp2=(j<col?0:1);
cofactor1[i*(n-1)+j]=mat[(i+temp1)*n+j+temp2];
}
}
double sum=det(n-1,cofactor1)*pow(-1,1.0*(row+col));
return sum;
}
void adjoint(double *mat,int n,double *adjointmat)//求伴随矩阵
{
for(int i=0;i<n*n;i++)
{
adjointmat[i]=cofactor(i%n,((i-i%n)/n),mat,n);
}
}
int main()
{
while(~scanf("%d",&n))
{
double *Mat=new double[n*n];
double *adjointmat=new double[n*n];
double detMat;
for(int i=0;i<n*n;i++)
cin>>Mat[i];
detMat=det(n,Mat);
if(detMat==0||n<=0)
{
cout<<false_1<<endl;
}
else if(n==1)
{
if(Mat[0]==0)
cout<<false_1<<endl;
else
printf("%.2lf\n",1.0/Mat[0]);
}
else
{
adjoint(Mat,n,adjointmat);//求伴随矩阵
int index=0;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(adjointmat[index]==(-0))
adjointmat[index]=0;
printf("%.2lf",adjointmat[index]/detMat);
if(j!=(n-1)) cout<<" ";
index++;
}
cout<<endl;
}
delete[]Mat;
delete[]adjointmat;
}
}
return 0;
}
写了这个感觉1起始选手确实有优势
0起始我好多计算要验证下hhh