C语言 n*n矩阵求值及求逆矩阵

来源:互联网 发布:黑暗之魂2剧情 知乎 编辑:程序博客网 时间:2024/05/16 14:10

求出矩阵的值以及输出逆矩阵,英语不好,略拗口。

上代码:

#include<stdio.h>#include<string.h>#include<math.h>int map1[110][110],i,j,k,l,m,n,p,vis[110][110],num;int just[110][110];int just2[110][110];void print(int map[][110],int n)//打印矩阵 {int j;for(int i=1;i<=n;i++){for(j=1;j<n;j++)printf("%d ",map[i][j]);printf("%d\n",map[i][j]);}}int slove(int map[][110],int n)//三阶行列式求值,高阶的请自动忽略 {memset(vis,0,sizeof(vis));int i,j,ans=0;if(n==1)return map[1][1];if(n==2)return map[1][1]*map[2][2]-map[1][2]*map[2][1];for(i=1;i<=n;i++){int help=1;for(j=0;j<n;j++){int cnt=i+j;cnt%=n;if(cnt==0)cnt=n;if(!vis[1+j][cnt]){//printf ("%d %d ",1+j,cnt);help*=map[1+j][cnt];vis[1+j][cnt]=1;}elsebreak;//printf("\n");}ans+=help;} memset(vis,0,sizeof(vis));for(i=1;i<=n;i++){int help=1;for(j=0;j<n;j++){int cnt=i+j;cnt%=n;if(cnt==0)cnt=n;if(!vis[n-j][cnt]){help*=map[n-j][cnt];vis[n-j][cnt]=1;}}ans-=help;}return ans;}void get(int numi,int numj,int map[][110],int n)//得到余子式 {//memset(just,0,sizeof(just));int help[110][110],i,j,k,l;for(i=0;i<n+10;i++)for(j=0;j<n+10;j++)help[i][j]=1;for(i=1;i<=n-1;i++)//求余子式矩阵 for(j=1;j<=n-1;j++){if(i>=numi&&j<numj)help[i][j]=map[i+1][j];else if(i>=numi&&j>=numj)help[i][j]=map[i+1][j+1];else if(i<numi&&j>=numj)help[i][j]=map[i][j+1];else if(i<numi&&j<numj)help[i][j]=map[i][j];}//print(help,n-1);for(i=0;i<=n-1;i++)for(j=0;j<=n-1;j++)just[i][j]=help[i][j];//if(n==2)//return help[1][1];//else//{//int nmd=0;//for(i=1;i<=n;i++)//{//if(i%2==1)//nmd+=help[1][i]*get(1,i,map,n);//else//nmd-=help[1][i]*get(1,i,map,n);//for(int nn=1;nn<=n-1;nn++)//for(int mm=1;mm<=n-1;mm++)//map[nn][mm]=help[nn][mm];//}//return nmd;//} //print(help,n-1);//int Ans=slove(help,n-1);//printf("+++%d\n",Ans);//return Ans;}int getans(int nn)//求当前行列式为just时,just的值。 {int map[110][110]; for(int i=1;i<=nn;i++)for(int j=1;j<=nn;j++)map[i][j]=just[i][j];if(nn==2)return map[1][1]*map[2][2]-map[1][2]*map[2][1];else if(nn==1)return map[1][1];else{int cnb=0;for(int i=1;i<=nn;i++){get(1,i,map,nn);//得到当前余子式 just //printf("pay attention!\n");//print(map,nn); //print(just,nn-1);if(i%2==1)cnb+=map[1][i]*getans(nn-1);elsecnb-=map[1][i]*getans(nn-1);}return cnb;}} int gcd(int m,int n)//求逆矩阵时约分 {if(m<n)gcd(n,m);if(n==0)return m;elsereturn gcd(n,m%n);}void final(int n,int m)//打印当前两个值相除得到的最简分数 {if(n*m<0){printf("-");final(fabs(n),fabs(m));return ;}//printf("%d %d /////%d\n",n,m,gcd(n,m));if(m==1)printf("%d\t",n);else if(n%m==0)printf("%d\t",n/m);else printf("%d/%d\t",n/gcd(n,m),m/gcd(n,m));}int main(){while(1){printf("please input the determinant`s size:\n");//输入矩阵的规格 scanf("%d",&n);//memset(map,1,sizeof(map));    for(i=0;i<n+10;i++)    for(j=0;j<n+10;j++)    map1[i][j]=1;int ans=0;printf("please input the determinant:\n");//输入矩阵 for(i=1;i<=n;i++)for(j=1;j<=n;j++){scanf("%d",&map1[i][j]);just[i][j]=map1[i][j];//just即 为当前矩阵 }printf("the value of the determinant is:\n"); //int help1=slove(map1,n);int ans1=getans(n);//矩阵的值 printf("ans is %d\n",ans1);//printf("%d\n",help1);int map2[110][110];for(i=1;i<=n;i++)//求转置行列式 for(j=1;j<=n;j++){map2[i][j]=map1[j][i];just[i][j]=map2[i][j];}printf("Transpose the determinant is:\n"); //转置矩阵 printf("the value of the determinant is:\n"); //转置矩阵的值 print(map2,n);//int help2=slove(map2,n);int help2=getans(n);printf("%d\n",help2);if(help2==0){printf("this matrix dont have inverse matrix!!!\n");continue;//矩阵值为0,无逆矩阵 }printf("***************\n");printf("inverse matrix is:\n");//输出逆矩阵 int Num=0;for(i=1;i<=n;i++){for(j=1;j<=n;j++){get(i,j,map2,n);//得到当前just     //printf("+++++++++++\n");//print(just,n-1);//printf("+++++++++++\n");//printf("+-*/%d\n",getans(n-1));if((i+j)%2==0)final(getans(n-1),ans1);elsefinal(-1*getans(n-1),ans1);} printf("\n");}}}


1 0
原创粉丝点击