求n阶矩阵的逆矩阵
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main()
{
int **c(int n,int **p);
double f(int N, int **p);
int i, j, num,k;
int m,n,a,b;
int **q;
printf("求n阶矩阵的逆矩阵\n");
printf("请输入阶数:");
while (scanf("%d", &num)!=EOF)
{
printf("请输入矩阵:\n");
int** array=(int**)malloc(sizeof(int*) * num);
for (i=0;i<num;i++)
{
array[i]=(int*)malloc(sizeof(int) * num);
}
for (i=0;i<num;i++)
{
for (j=0;j<num;j++)
scanf("%d",&array[i][j]);
}
k=f(num, array);
if(k==0)
{
printf("该矩阵的值为0,不存在逆矩阵!\n");
main();
}
else q=c(num,array);
printf("其矩阵的值为:%d\n",k);
printf("其伴随矩阵为:\n");
for(int i=0;i<num;i++)
{
for(int j=0;j<num;j++)
printf("%d\t",*(*(q+i)+j));
printf("\n");
}
int y=0;
float m,n;
int a,b,u,e,t;
printf("其逆矩阵为:\n");
for(int i=0;i<num;i++)
{
for(int j=0;j<num;j++)
{
if(*(*(q+i)+j)<0) u=-*(*(q+i)+j);
else u=*(*(q+i)+j);
if(k<0) e=-k;
else e=k;
n=(float)*(*(q+i)+j)/(float)k;
m=(float)u/(float)e;
if(*(*(q+i)+j)==0) { printf("0\t"); }
else
{
if(fmod(m,1)==0)
{
if(*(*(q+i)+j)*k>0) printf("%.0f\t",m);
else printf("-%.0f\t",m);
}
else
{
for(int s=e;s>=0;s--)
{
if(fmod(u,s)==0&&fmod(e,s)==0)
{
if(*(*(q+i)+j)*k>0) t=1;
else t=-1;
a=t*u/s;
b=e/s;
printf("%d/%d\t",a,b);
break;
}
}
}
}
y++;
}
if(y==num)
{ printf("\n"); y=0; }
}
}
return 0;
}
int **c(int n,int **p)
{
int x,k=0,z=0,w=0,v=0;
int sign=1;
double f(int N, int **p);
int **c=(int**)malloc(sizeof(int*)*n);
for(int i=0;i<n;i++)
c[i]=(int*)malloc(sizeof(int)*n);
int **b=(int**)malloc(sizeof(int*)*n-1);
for(int i=0;i<n-1;i++)
b[i]=(int*)malloc(sizeof(int)*n-1);
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
int s=0,r=0;
for(int k=0;k<n;k++)
for(int t=0;t<n;t++)
{
if(k==i||t==j) continue;
else
{
*(*(b+s)+r++)=*(*(p+k)+t);
if(r==n-1){s++;r=0;}
}
}
*(*(c+w++)+v)=f(n-1,b);
}
if(w==n) { v++;w=0; }
}
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
if((i+j)%2==0) *(*(c+i)+j)*=1;
else *(*(c+i)+j)*=-1;
*(*(c+i)+j)=*(*(c+i)+j)*sign;
// sign=-sign;
}
return c;
free(b);
free(c);
}
double f(int N, int **p)
{
if (N==1)
return p[0][0];
else if (N==2)
return p[0][0]*p[1][1]-p[0][1]*p[1][0];
else
{
double result=0;
int i, j, m, k, l, sign=1,h;
for (i=0;i<N;i++)
{
int **tmp=(int**)malloc(sizeof(int*)*(N-1));
for (h = 0; h < N - 1; h++)
{
tmp[h]=(int*)malloc(sizeof(int)*(N-1));
}
l=0;
k=0;
for (m=1;m<N;m++)
{
for (j=0;j<N;j++)
{
if (j==i)
continue;
else
{
if (k==N-1)
{
k=0;
l++;
}
tmp[l][k++]=p[m][j];
}
}
}
result+=f(N-1,tmp)*sign*p[0][i];
for (h=0; h<N-1; h++)
{
free(tmp[h]);
}
free(tmp);
sign = -sign;
}
return result;
}
}