📄 inv.cpp
字号:
#include<stdio.h>
#include<malloc.h>
double *C,a[100];
double *MatrixInver(double A[],int n) //矩阵转置
{
int i,j;
double *B=NULL;
B=(double *)malloc(n*n*sizeof(double));
for(i=0;i <n;i++)
for(j=0;j <n;j++)
B[i*n+j]=A[j*n+i];
return B;
}
double Surplus(double A[],int n) //求矩阵行列式
{
int i,j,k,p,r;
double X,temp=1,temp1=1,s=0,s1=0;
if(n==2)
{for(i=0;i <n;i++)
for(j=0;j <n;j++)
if((i+j)%2) temp1*=A[i*n+j];
else temp*=A[i*n+j];
X=temp-temp1;}
else{
for(k=0;k <n;k++)
{for(i=0,j=k;i <n,j <n;i++,j++)
temp*=A[i*n+j];
if(n-i)
{for(p=n-i,r=n-1;p> 0;p--,r--)
temp*=A[r*n+p-1];}
s+=temp;
temp=1;
}
for(k=n-1;k>=0;k--)
{for(i=0,j=k;i<n,j>=0;i++,j--)
temp1*=A[i*n+j];
if(n-i)
{for(p=n-1,r=i;r <n;p--,r++)
temp1*=A[r*n+p];}
s1+=temp1;
temp1=1;
}
X=s-s1;}
return X;
}
double *MatrixOpp(double A[],int n) //矩阵求逆
{
int i,j,x,y,k;
double *SP=NULL,*AB=NULL,*B=NULL,X; //*C;
SP=(double *)malloc(n*n*sizeof(double));
AB=(double *)malloc(n*n*sizeof(double));
B=(double *)malloc(n*n*sizeof(double));
X=Surplus(A,n);
X=1/X;
for(i=0;i<n;i++) //求矩阵伴随矩阵
for(j=0;j<n;j++)
{
for(k=0;k<n*n;k++)
B[k]=A[k]; //B[]变成A[];
{
for(x=0;x<n;x++)
B[i*n+x]=0;
for(y=0;y<n;y++)
B[n*y+j]=0;
B[i*n+j]=1;
SP[i*n+j]=Surplus(B,n);
AB[i*n+j]=X*SP[i*n+j];
}
}
C=MatrixInver(AB,n); //MatrixInver 求倒置
return C;
}
int main()
{
int n,i;
while(scanf("%d",&n)!=EOF) //求m*n阶矩阵的逆运算
{
for(i=0;i<n*n;i++)
scanf("%lf",&a[i]);//printf("%lf\n",Surplus(a,m,n)); //输出行列式
MatrixOpp(a,n);
for(i=0;i<n*n;i++)
{
printf("%.5f ",C[i]);
if(!((i+1)%n))
printf("\n");
}
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -