求n阶矩阵的逆矩阵(C语言实现)

求n阶矩阵的逆矩阵

求行列式的值部分:https://blog.csdn.net/qq_30291317/article/details/114364893?ops_request_misc=&request_id=&biz_id=102&utm_term=%E6%B1%82n%E9%98%B6%E7%9F%A9%E9%98%B5%E7%9A%84%E5%80%BC&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-5-.first_rank_v2_pc_rank_v29&spm=1018.2226.3001.4187

#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;              
    }
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值